Diff for /loncom/interface/lonmeta.pm between versions 1.193 and 1.232

version 1.193, 2007/01/02 19:38:17 version 1.232, 2009/04/29 15:20:54
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 182  sub evalgraph { Line 164  sub evalgraph {
     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) {
  $output.='<td width="20" bgcolor="#555555">&nbsp&nbsp;</td>';   $output.='<td width="20" bgcolor="#555555">'.('&nbsp;' x2).'</td>';
     } else {      } else {
         $output.='<td width="'.($val).'" bgcolor="#555555">&nbsp;</td>'.          $output.='<td width="'.($val).'" bgcolor="#555555">&nbsp;</td>'.
                  '<td width="'.(20-$val).'" bgcolor="#FF3333">&nbsp;</td>';                   '<td width="'.(20-$val).'" bgcolor="#FF3333">&nbsp;</td>';
Line 192  sub evalgraph { Line 174  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;' x2).'</td>';
     }      }
     $output.='<td> ('.sprintf("%5.2f",$value).') </td></tr></table>';      $output.='<td> ('.sprintf("%5.2f",$value).') </td></tr></table>';
     return $output;      return $output;
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 356  sub pre_select_course { Line 338  sub pre_select_course {
         &Apache::lonpublisher::metaeval($result);          &Apache::lonpublisher::metaeval($result);
     }      }
     $r->print('<hr /><form method="post" action="" >');      $r->print('<hr /><form method="post" action="" >');
     $r->print('<p>'.&mt('If you would like to associate this resource ([_1]) with a current or previous course, please select one from the list below, otherwise select, \'None\'','<tt>'.$res_uri.'</tt>').'</p>');      $r->print('<p>'.&mt('If you would like to associate this resource ([_1]) with a current or previous course, please select one from the list below, otherwise select, "None".','<tt>'.$res_uri.'</tt>').'</p>');
     $output = &select_course();      $output = &select_course();
     $r->print($output.'<br /><input type="submit" name="store" value="'.      $r->print($output.'<br /><input type="submit" name="store" value="'.
                   &mt('Associate Resource With Selected Course').'" />');                    &mt('Associate Resource With Selected Course').'" />');
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 417  sub prettyprint { Line 432  sub prettyprint {
     }      }
     # Title      # Title
     if ($type eq 'title') {      if ($type eq 'title') {
  return '<font size="+1" face="arial">'.$value.'</font>';   return $value;
     }      }
     # Dates      # Dates
     if (($type eq 'creationdate') ||      if (($type eq 'creationdate') ||
Line 467  sub prettyprint { Line 482  sub prettyprint {
  ($type eq 'comefrom_list') ||   ($type eq 'comefrom_list') ||
  ($type eq 'sequsage_list') ||   ($type eq 'sequsage_list') ||
  ($type eq 'dependencies')) {   ($type eq 'dependencies')) {
  return '<font size="-1"><ul>'.join("\n",map {   return '<ul class="LC_fontsize_medium">'.join("\n",map {
             my $url = &Apache::lonnet::clutter_with_no_wrapper($_);              my $url = &Apache::lonnet::clutter_with_no_wrapper($_);
             my $title = &Apache::lonnet::gettitle($url);              my $title = &Apache::lonnet::gettitle($url);
             if ($title eq '') {              if ($title eq '') {
Line 485  sub prettyprint { Line 500  sub prettyprint {
                 }                   } 
             }              }
             $_ = '<li>'.$title.' '.              $_ = '<li>'.$title.' '.
  &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'-1',$noformat).   &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'0',$noformat).
                 '</li>'                  '</li>'
     } split(/\s*\,\s*/,$value)).'</ul></font>';      } split(/\s*\,\s*/,$value)).'</ul>';
     }      }
     # Evaluations      # Evaluations
     if (($type eq 'clear') ||      if (($type eq 'clear') ||
Line 504  sub prettyprint { Line 519  sub prettyprint {
     # List of courses      # List of courses
     if ($type=~/\_list/) {      if ($type=~/\_list/) {
         my @Courses = split(/\s*\,\s*/,$value);          my @Courses = split(/\s*\,\s*/,$value);
         my $Str='<font size="-1"><ul>';          my $Str='<ul class="LC_fontsize_medium">';
  my %descriptions;   my %descriptions;
         foreach my $course (@Courses) {          foreach my $course (@Courses) {
             my %courseinfo =              my %courseinfo =
Line 523  sub prettyprint { Line 538  sub prettyprint {
     $Str .= $descriptions{$course};      $Str .= $descriptions{$course};
  }   }
   
  return $Str.'</ul></font>';   return $Str.'</ul>';
     }      }
     # No pretty print found      # No pretty print found
     return $value;      return $value;
Line 540  sub selectbox { Line 555  sub selectbox {
         $functionref=\&direct;          $functionref=\&direct;
     }      }
     my $selout='<select name="'.$name.'">';      my $selout='<select name="'.$name.'">';
     foreach (@idlist) {      foreach my $id (@idlist) {
         $selout.='<option value=\''.$_.'\'';          $selout.='<option value="'.$id.'"';
         if ($_ eq $value) {          if ($id eq $value) {
     $selout.=' selected>'.&{$functionref}($_).'</option>';      $selout.=' selected="selected">'.&{$functionref}($id).'</option>';
  }          } else {
         else {$selout.='>'.&{$functionref}($_).'</option>';}              $selout.='>'.&{$functionref}($id).'</option>';
           }
     }      }
     return $selout.'</select>';      return $selout.'</select>';
 }  }
Line 562  sub relatedfield { Line 578  sub relatedfield {
         return $relatedsep.'&nbsp;';          return $relatedsep.'&nbsp;';
     }      }
     return $relatedsep.'<input type="checkbox" name="'.$fieldname.'_related"'.      return $relatedsep.'<input type="checkbox" name="'.$fieldname.'_related"'.
  ($relatedvalue?' checked="1"':'').' />';   ($relatedvalue?' checked="checked"':'').' />';
 }  }
   
 sub prettyinput {  sub prettyinput {
Line 598  sub prettyinput { Line 614  sub prettyinput {
                 if ($meta_options{$item}) {                  if ($meta_options{$item}) {
                     push(@cur_values_inst,$item);                      push(@cur_values_inst,$item);
                 } else {                  } else {
                     $cur_values_stu .= $item.',';                      if ($item ne '') {
                           $cur_values_stu .= $item.',';
                       }
                 }                  }
             }              }
                $cur_values_stu =~ s/,$//;
               my @key_order = sort(keys(%meta_options));
               unshift(@key_order,'');
               $meta_options{''} = 'Not specified';
               $meta_options{'select_form_order'} = \@key_order;
         } else {          } else {
             $cur_values_stu = $value;              $cur_values_stu = $value;
         }          }
Line 608  sub prettyinput { Line 631  sub prettyinput {
             return (&select_course());              return (&select_course());
             # return ('<input type="hidden" name="new_courserestricted" value="'.$course_key.'" />');              # return ('<input type="hidden" name="new_courserestricted" value="'.$course_key.'" />');
         }          }
         my $course = $env{'request.course.id'};  
         if (($type eq 'keywords') || ($type eq 'subject')          if (($type eq 'keywords') || ($type eq 'subject')
              || ($type eq 'author')||($type eq  'notes')               || ($type eq 'author')||($type eq  'notes')
              || ($type eq  'abstract')|| ($type eq  'title')|| ($type eq  'standards')               || ($type eq  'abstract')|| ($type eq  'title')|| ($type eq  'standards')
              || (exists($env{'course.'.$env{'request.course.id'}.'.metadata.'.$type.'.added'}))) {               || (exists($env{$course_key.'.metadata.'.$type.'.added'}))) {
               
             if ($values) {              if ($values) {
                 if ($only_one) {                  if ($only_one) {
                     $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,%meta_options));                      $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,%meta_options));
Line 668  sub prettyinput { Line 691  sub prettyinput {
     # Obsolete      # Obsolete
     if ($type eq 'obsolete') {      if ($type eq 'obsolete') {
  return '<input type="checkbox" name="'.$fieldname.'"'.   return '<input type="checkbox" name="'.$fieldname.'"'.
     ($value?' checked="1"':'').' />'.      ($value?' checked="checked"':'').' />'.
             &relatedfield(0,$relatedsearchflag,$relatedsep);               &relatedfield(0,$relatedsearchflag,$relatedsep); 
     }      }
     # Obsolete replacement file      # Obsolete replacement file
Line 739  sub handler { Line 762  sub handler {
     } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/portfolio/|) {      } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/portfolio/|) {
     ($resdomain,$resuser)=      ($resdomain,$resuser)=
  (&Apache::lonnet::declutter($uri)=~m|^($match_domain)/($match_name)/portfolio|);   (&Apache::lonnet::declutter($uri)=~m|^($match_domain)/($match_name)/portfolio|);
         $r->print(&Apache::loncommon::start_page('Edit Portfolio File Catalog Information',          $r->print(&Apache::loncommon::start_page('Edit Portfolio File Metadata',
  undef,   undef,
  {'domain' => $resdomain,}));   {'domain' => $resdomain,}));
         if ($env{'form.store'}) {          if ($env{'form.store'}) {
Line 750  sub handler { Line 773  sub handler {
             %Apache::lonpublisher::metadatakeys=();              %Apache::lonpublisher::metadatakeys=();
             my $result=&Apache::lonnet::getfile($fn);              my $result=&Apache::lonnet::getfile($fn);
             &Apache::lonpublisher::metaeval($result);              &Apache::lonpublisher::metaeval($result);
             &Apache::lonnet::logthis("restricted is: ".$Apache::lonpublisher::metadatafields{'courserestricted'});  
             if ((!$Apache::lonpublisher::metadatafields{'courserestricted'}) ||              if ((!$Apache::lonpublisher::metadatafields{'courserestricted'}) ||
                 ($env{'form.changecourse'} eq 'true')) {                  ($env{'form.changecourse'} eq 'true')) {
                 &pre_select_course($r,$uri);                  &pre_select_course($r,$uri);
Line 759  sub handler { Line 781  sub handler {
             }              }
         }          }
     } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/groups/|) {      } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/groups/|) {
         $r->print(&Apache::loncommon::start_page('Edit Group Portfolio File Catalog Information',          $r->print(&Apache::loncommon::start_page('Edit Group Portfolio File Metadata',
  undef,   undef,
  {'domain' => $resdomain,}));   {'domain' => $resdomain,}));
         &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 Metadata',
  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 798  sub report_bombs { Line 822  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);
         foreach (sort(keys(%brokenurls))) {          foreach my $key (sort(keys(%brokenurls))) {
             if ($_=~/^\Q$uri\E/) {              if ($key=~/^\Q$uri\E/) {
                 $r->print                  $r->print
                     ('<a href="'.&Apache::lonnet::clutter($_).'">'.$_.'</a>'.                      ('<a href="'.&Apache::lonnet::clutter($key).'">'.$key.'</a>'.
                      &Apache::lonmsg::retrieve_author_res_msg($_).                       &Apache::lonmsg::retrieve_author_res_msg($key).
                      '<hr />');                       '<hr />');
             }              }
         }          }
Line 832  sub present_uneditable_metadata { Line 860  sub present_uneditable_metadata {
     my $uploaded = ($uri =~ m|/uploaded/|);      my $uploaded = ($uri =~ m|/uploaded/|);
     my %content=();      my %content=();
     # Read file      # Read file
     foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {      foreach my $key (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {
         $content{$_}=&Apache::lonnet::metadata($uri,$_);          $content{$key}=&Apache::lonnet::metadata($uri,$key);
     }      }
     # Render Output      # Render Output
     # displayed url      # displayed url
Line 861  sub present_uneditable_metadata { Line 889  sub present_uneditable_metadata {
     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><span class="LC_warning">'.
             &mt('This resource has been marked obsolete by the author(s)').              &mt('This resource has been marked obsolete by the author(s)').
             '</font></p>';              '</span></p>';
     }      }
     #      #
     my %lt=&fieldnames();      my %lt=&fieldnames();
Line 899  sub present_uneditable_metadata { Line 927  sub present_uneditable_metadata {
    'obsolete',      'obsolete', 
    'obsoletereplacement');     'obsoletereplacement');
     }      }
       my $rownum = 0;
     foreach my $field (@fields) {      foreach my $field (@fields) {
         $table.='<tr><td bgcolor="#AAAAAA">'.$lt{$field}.          my $lastrow = '';
             '</td><td bgcolor="#CCCCCC">'.          $rownum ++;
             &prettyprint($field,$content{$field}).'</td></tr>';          $lastrow = 1 if ($rownum == @fields); 
           $table.=&Apache::lonhtmlcommon::row_title($lt{$field})
                  .&prettyprint($field,$content{$field})
                  .&Apache::lonhtmlcommon::row_closure($lastrow);
         delete($content{$field});          delete($content{$field});
     }      }
     #      #
     $r->print(<<ENDHEAD);      $r->print("<h2>$title</h2>"
 <h2>$title</h2>               .'<p>'
 <p>               .$disuri.'<br />'
 $disuri<br />               .$obsoletewarning
 $obsoletewarning               .$versiondisplay
 $versiondisplay               .'</p>'
 </p>               .&Apache::lonhtmlcommon::start_pick_box()
 <table cellspacing="2" border="0">               .$table
 $table               .&Apache::lonhtmlcommon::end_pick_box()
 </table>      );
 ENDHEAD  
     if (!$uploaded && $env{'user.adv'}) {      if (!$uploaded && $env{'user.adv'}) {
         &print_dynamic_metadata($r,$uri,\%content);          &print_dynamic_metadata($r,$uri,\%content);
     }      }
Line 937  sub print_dynamic_metadata { Line 968  sub print_dynamic_metadata {
     my %dynmeta=&dynamicmeta($uri);      my %dynmeta=&dynamicmeta($uri);
     #      #
     # General Access and Usage Statistics      # General Access and Usage Statistics
       $r->print('<h4>'.&mt('Access and Usage Statistics').'</h4>');
     if (exists($dynmeta{'count'}) ||      if (exists($dynmeta{'count'}) ||
         exists($dynmeta{'sequsage'}) ||          exists($dynmeta{'sequsage'}) ||
         exists($dynmeta{'comefrom'}) ||          exists($dynmeta{'comefrom'}) ||
         exists($dynmeta{'goto'}) ||          exists($dynmeta{'goto'}) ||
         exists($dynmeta{'course'})) {          exists($dynmeta{'course'})) {
         $r->print('<h4>'.&mt('Access and Usage Statistics').'</h4>'.          $r->print(&Apache::lonhtmlcommon::start_pick_box());
                   '<table cellspacing="2" border="0">');          my @counts = ('count','sequsage','sequsage_list',
         foreach ('count',                        'comefrom','comefrom_list','goto',
                  'sequsage','sequsage_list',                        'goto_list','course','course_list');
                  'comefrom','comefrom_list',          my $rownum = 0;
                  'goto','goto_list',          foreach my $item (@counts) {
                  'course','course_list') {              my $lastrow = '';
             $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'.              $rownum ++;
                       '<td bgcolor="#CCCCCC">'.              $lastrow = 1 if ($rownum == @counts);
                       &prettyprint($_,$dynmeta{$_})."</td></tr>\n");              $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
                        .&prettyprint($item,$dynmeta{$item})
                        .&Apache::lonhtmlcommon::row_closure($lastrow)
               );
         }          }
         $r->print('</table>');          $r->print(&Apache::lonhtmlcommon::end_pick_box());
     } else {      } else {
         $r->print('<h4>'.&mt('No Access or Usages Statistics are available for this resource.').'</h4>');          $r->print('<p>'
                    .&mt('No Access or Usages Statistics are available for this resource.')
                    .'</p>'
           );
     }      }
     #      #
     # Assessment statistics      # Assessment statistics
Line 968  sub print_dynamic_metadata { Line 1006  sub print_dynamic_metadata {
             $r->print('<h4>'.              $r->print('<h4>'.
                       &mt('Overall Assessment Statistical Data').                        &mt('Overall Assessment Statistical Data').
                       '</h4>'.                        '</h4>'.
                       '<table cellspacing="2" border="0">');                        &Apache::lonhtmlcommon::start_pick_box());
             $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{'stdno'}.'</td>'.              $r->print(&Apache::lonhtmlcommon::row_title($lt{'stdno'})
                       '<td bgcolor="#CCCCCC">'.                       .&prettyprint('stdno',$dynmeta{'stdno'})
                       &prettyprint('stdno',$dynmeta{'stdno'}).                       .&Apache::lonhtmlcommon::row_closure()
                       '</td>'."</tr>\n");              );
             foreach ('avetries','difficulty','disc') {              my @stats = ('avetries','difficulty','disc');
                 $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'.              my $rownum = 0;
                           '<td bgcolor="#CCCCCC">'.              foreach my $item (@stats) {
                           &prettyprint($_,sprintf('%5.2f',$dynmeta{$_})).                  my $lastrow = '';
                           '</td>'."</tr>\n");                  $rownum ++;
             }                  $lastrow = 1 if ($rownum == @stats);
             $r->print('</table>');                      $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
         }                           .&prettyprint($item,sprintf('%5.2f',$dynmeta{$item}))
                            .&Apache::lonhtmlcommon::row_closure($lastrow)
                   );
               }
               $r->print(&Apache::lonhtmlcommon::end_pick_box());
           }
           #
           # New assessment statistics
           $r->print('<h4>'
                    .&mt('Recent Detailed Assessment Statistical Data')
                    .'</h4>'
           );
         if (exists($dynmeta{'stats'})) {          if (exists($dynmeta{'stats'})) {
             #              my $table=&Apache::loncommon::start_data_table()
             # New assessment statistics                       .&Apache::loncommon::start_data_table_header_row()
             $r->print('<h4>'.                       .'<th>'.&mt('Course').'</th>'
                       &mt('Detailed Assessment Statistical Data').                       .'<th>'.&mt('Section(s)').'</th>'
                       '</h4>');                       .'<th>'.&mt('Num Students').'</th>'
             my $table = '<table cellspacing="2" border="0">'.                       .'<th>'.&mt('Mean Tries').'</th>'
                 '<tr>'.                       .'<th>'.&mt('Degree of Difficulty').'</th>'
                 '<th>Course</th>'.                       .'<th>'.&mt('Degree of Discrimination').'</th>'
                 '<th>Section(s)</th>'.                       .'<th>'.&mt('Time of computation').'</th>'
                 '<th>Num Students</th>'.                       .&Apache::loncommon::end_data_table_header_row().$/;
                 '<th>Mean Tries</th>'.  
                 '<th>Degree of Difficulty</th>'.  
                 '<th>Degree of Discrimination</th>'.  
                 '<th>Time of computation</th>'.  
                 '</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};
                 my $course = $data->{'course'};                  my $course = $data->{'course'};
Line 1007  sub print_dynamic_metadata { Line 1051  sub print_dynamic_metadata {
                     &Apache::lonnet::logthis('lookup for '.$course.' failed');                      &Apache::lonnet::logthis('lookup for '.$course.' failed');
                     next;                      next;
                 }                  }
                 $table .= '<tr>';                  $table .= &Apache::loncommon::start_data_table_row();
                 $table .=                   $table .= 
                     '<td><nobr>'.$courseinfo{'description'}.'</nobr></td>';                      '<td><span class="LC_nobreak">'.$courseinfo{'description'}.'</span></td>';
                 $table .=                   $table .= 
                     '<td align="right">'.$data->{'sections'}.'</td>';                      '<td align="right">'.$data->{'sections'}.'</td>';
                 $table .=                  $table .=
                     '<td align="right">'.$data->{'stdno'}.'</td>';                      '<td align="right">'.$data->{'stdno'}.'</td>';
                 foreach ('avetries','difficulty','disc') {                  foreach my $item ('avetries','difficulty','disc') {
                     $table .= '<td align="right">';                      $table .= '<td align="right">';
                     if (exists($data->{$_})) {                      if (exists($data->{$item})) {
                         $table .= sprintf('%.2f',$data->{$_}).'&nbsp;';                          $table .= sprintf('%.2f',$data->{$item}).'&nbsp;';
                     } else {                      } else {
                         $table .= '';                          $table .= '';
                     }                      }
                     $table .= '</td>';                      $table .= '</td>';
                 }                  }
                 $table .=                  $table .=
                     '<td><nobr>'.                      '<td><span class="LC_nobreak">'.
                     &Apache::lonlocal::locallocaltime($data->{'timestamp'}).                      &Apache::lonlocal::locallocaltime($data->{'timestamp'}).
                     '</nobr></td>';                      '</span></td>';
                 $table .=                  $table .= &Apache::loncommon::end_data_table_row().$/;
                     '</tr>'.$/;  
             }              }
             $table .= '</table>'.$/;              $table .= &Apache::loncommon::end_data_table().$/;
             $r->print($table);              $r->print($table);
         } else {          } else {
             $r->print('No new dynamic data found.');              $r->print('<p>'
                        .&mt('No new dynamic data found.')
                        .'</p>'
               );
         }          }
     } else {      } else {
         $r->print('<h4>'.          $r->print('<h4>'.
Line 1042  sub print_dynamic_metadata { Line 1088  sub print_dynamic_metadata {
     }      }
   
     #      #
     #      # Evaluation Data
       $r->print('<h4>'.&mt('Evaluation Data').'</h4>');
     if (exists($dynmeta{'clear'})   ||       if (exists($dynmeta{'clear'})   || 
         exists($dynmeta{'depth'})   ||           exists($dynmeta{'depth'})   || 
         exists($dynmeta{'helpful'}) ||           exists($dynmeta{'helpful'}) || 
         exists($dynmeta{'correct'}) ||           exists($dynmeta{'correct'}) || 
         exists($dynmeta{'technical'})){           exists($dynmeta{'technical'})){ 
         $r->print('<h4>'.&mt('Evaluation Data').'</h4>'.          $r->print(&Apache::lonhtmlcommon::start_pick_box());
                   '<table cellspacing="2" border="0">');          my @criteria = ('clear','depth','helpful','correct','technical');
         foreach ('clear','depth','helpful','correct','technical') {          my $rownum = 0;
             $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'.          foreach my $item (@criteria) {
                       '<td bgcolor="#CCCCCC">'.              my $lastrow = '';
                       &prettyprint($_,$dynmeta{$_})."</td></tr>\n");              $rownum ++;
               $lastrow = 1 if ($rownum == @criteria);
               $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
                        .&prettyprint($item,$dynmeta{$item})
                        .&Apache::lonhtmlcommon::row_closure($lastrow)
               );
         }          }
         $r->print('</table>');          $r->print(&Apache::lonhtmlcommon::end_pick_box());
     } else {      } else {
         $r->print('<h4>'.&mt('No Evaluation Data is available for this resource.').'</h4>');          $r->print('<p>'
                    .&mt('No Evaluation Data is available for this resource.')
                    .'</p>'
           );
     }      }
       # Evaluation Comments
     $uri=~/^\/res\/($match_domain)\/($match_username)\//;       $uri=~/^\/res\/($match_domain)\/($match_username)\//; 
     if ((($env{'user.domain'} eq $1) && ($env{'user.name'} eq $2))      if ((($env{'user.domain'} eq $1) && ($env{'user.name'} eq $2))
         || ($env{'user.role.ca./'.$1.'/'.$2})) {          || ($env{'user.role.ca./'.$1.'/'.$2})) {
           $r->print('<h4>'.&mt('Evaluation Comments').'</h4>'
                    .'<div>('
                    .&mt('visible to author and co-authors only')
                    .')</div>'
           );
         if (exists($dynmeta{'comments'})) {          if (exists($dynmeta{'comments'})) {
             $r->print('<h4>'.&mt('Evaluation Comments').' ('.              $r->print('<blockquote>'.$dynmeta{'comments'}.'</blockquote>');
                       &mt('visible to author and co-authors only').  
                       ')</h4>'.  
                       '<blockquote>'.$dynmeta{'comments'}.'</blockquote>');  
         } else {          } else {
             $r->print('<h4>'.&mt('There are no Evaluation Comments on this resource.').'</h4>');              $r->print('<p>'
                        .&mt('There are no Evaluation Comments on this resource.')
                        .'</p>'
               );
         }          }
         my $bombs = &Apache::lonmsg::retrieve_author_res_msg($uri);          my $bombs = &Apache::lonmsg::retrieve_author_res_msg($uri);
         if (defined($bombs) && $bombs ne '') {          if (defined($bombs) && $bombs ne '') {
             $r->print('<a name="bombs" /><h4>'.&mt('Error Messages').' ('.              $r->print('<a name="bombs" />'
                       &mt('visible to author and co-authors only').')'.                       .'<h4 class="LC_error">'.&mt('Error Messages').'</h4>'
                       '</h4>'.$bombs);                       .'<div>('
         } else {                       .&mt('visible to author and co-authors only')
             $r->print('<h4>'.&mt('There are currently no Error Messages for this resource.').'</h4>');                       .')</div>'
         }                       .$bombs
               );
           } #else {
           #    $r->print('<h4>'.&mt('There are currently no Error Messages for this resource.').'</h4>');
           #}
     }      }
     #      #
     # All other stuff      # All other stuff
     $r->print('<h3>'.      $r->print('<h3>'.
               &mt('Additional Metadata (non-standard, parameters, exports)').                &mt('Additional Metadata (non-standard, parameters, exports)').
               '</h3><table border="0" cellspacing="1">');                '</h3>');
     foreach (sort(keys(%content))) {      $r->print(&Apache::lonhtmlcommon::start_pick_box());
         my $name=$_;      my @names;
         if ($name!~/\.display$/) {      foreach my $key (sort(keys(%content))) {
           if ($key!~/\.display$/) {
               push(@names,$key);
           }
       }
       if (@names > 0) {
           my $rownum = 0;
           foreach my $name (@names) {
               my $lastrow = '';
               $rownum ++;
               $lastrow = 1 if ($rownum == @names);
   
             my $display=&Apache::lonnet::metadata($uri,              my $display=&Apache::lonnet::metadata($uri,
                                                   $name.'.display');                                                    $name.'.display');
             if (! $display) {               if (! $display) { 
                 $display=$name;                  $display=$name;
             };              };
             my $otherinfo='';              my $otherinfo='';
             foreach ('name','part','type','default') {              foreach my $item ('name','part','type','default') {
                 if (defined(&Apache::lonnet::metadata($uri,                  if (defined(&Apache::lonnet::metadata($uri,
                                                       $name.'.'.$_))) {                                                        $name.'.'.$item))) {
                     $otherinfo.=' '.$_.'='.                      $otherinfo.=' '.$item.'='.
                         &Apache::lonnet::metadata($uri,                          &Apache::lonnet::metadata($uri,
                                                   $name.'.'.$_).'; ';                                                    $name.'.'.$item).'; ';
                 }                  }
             }              }
             $r->print('<tr><td bgcolor="#bbccbb"><font size="-1" color="#556655">'.$display.'</font></td><td bgcolor="#ccddcc"><font size="-1" color="#556655">'.$content{$name});              $r->print(&Apache::lonhtmlcommon::row_title($display)
                        .$content{$name}
               );
             if ($otherinfo) {              if ($otherinfo) {
                 $r->print(' ('.$otherinfo.')');                  $r->print(' ('.$otherinfo.')');
             }              }
             $r->print("</font></td></tr>\n");              $r->print(&Apache::lonhtmlcommon::row_closure($lastrow));
         }          }
     }      }
     $r->print("</table>");      $r->print(&Apache::lonhtmlcommon::end_pick_box());
     return;      return;
 }  }
   
Line 1171  ENDBOMBS Line 1249  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 1191  ENDDEL Line 1272  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;
  my $added_metadata_fields;   my $added_metadata_fields;
  my @added_order;   my @added_order;
           if ($file_type eq 'groups') {
               $Apache::lonpublisher::metadatafields{'courserestricted'}=
                   'course.'.$env{'request.course.id'};
           }
           if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) &&
                   (! $env{'form.new_courserestricted'}) && (! $file_type eq 'groups')) {
               $Apache::lonpublisher::metadatafields{'courserestricted'}=
                   'none';
           } elsif ($env{'form.new_courserestricted'}) {
               $Apache::lonpublisher::metadatafields{'courserestricted'}=
                   $env{'form.new_courserestricted'};
           }
  if ($file_type eq 'portfolio' || $file_type eq 'groups') {   if ($file_type eq 'portfolio' || $file_type eq 'groups') {
     if(exists ($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'})) {      if(exists ($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'})) {
         # retrieve fieldnames (in order) from the course restricted list          # retrieve fieldnames (in order) from the course restricted list
Line 1212  ENDEDIT Line 1318  ENDEDIT
         @fields =  ('author','title','subject','keywords','abstract',          @fields =  ('author','title','subject','keywords','abstract',
     'notes','lowestgradelevel',      'notes','lowestgradelevel',
                     'highestgradelevel','standards');                      'highestgradelevel','standards');
         $added_metadata_fields = &Apache::lonparmset::get_added_meta_fieldnames();                  if ($Apache::lonpublisher::metadatafields{'courserestricted'} =~ /^course\.($match_domain\_$match_courseid)$/) {
         if ($env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}) {                      my $assoc_crs = $1;
             @added_order = split(/,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'});              $added_metadata_fields = &Apache::lonparmset::get_added_meta_fieldnames($assoc_crs);
         }              if ($env{'course.'.$assoc_crs.'.metadata.addedorder'}) {
         $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'} = join(",",@fields);                  @added_order = split(/,/,$env{'course.'.$assoc_crs.'.metadata.addedorder'});
               }
               $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'} = join(",",@fields);
                   }
     }      }
  } else {   } else {
     @fields = ('author','title','subject','keywords','abstract','notes',      @fields = ('author','title','subject','keywords','abstract','notes',
Line 1225  ENDEDIT Line 1334  ENDEDIT
        'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',         'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',
        'obsolete','obsoletereplacement');         'obsolete','obsoletereplacement');
         }          }
         if ($file_type eq 'groups') {  
             $Apache::lonpublisher::metadatafields{'courserestricted'}=  
                 'course.'.$env{'request.course.id'};   
         }  
         if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) &&  
                 (! $env{'form.new_courserestricted'}) && (! $file_type eq 'groups')) {  
             $Apache::lonpublisher::metadatafields{'courserestricted'}=  
                 'none';  
         } elsif ($env{'form.new_courserestricted'}) {  
             $Apache::lonpublisher::metadatafields{'courserestricted'}=  
                 $env{'form.new_courserestricted'};   
         }             
         if (! $Apache::lonpublisher::metadatafields{'copyright'}) {          if (! $Apache::lonpublisher::metadatafields{'copyright'}) {
                 $Apache::lonpublisher::metadatafields{'copyright'}=                  $Apache::lonpublisher::metadatafields{'copyright'}=
     'default';      'default';
Line 1250  ENDEDIT Line 1347  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') {
     $r->print(&mt('Associated with course [_1]',      $r->print(&mt('Associated with course [_1]',
         '<strong><a href="'.$uri.'?changecourse=true">'.          '<strong><a href="'.$uri.'?changecourse=true">'.
Line 1265  ENDEDIT Line 1367  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 1283  ENDEDIT Line 1385  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 1313  ENDEDIT Line 1422  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="'.&mt('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 1388  ENDEDIT Line 1448  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 class="LC_error">';
               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').'</p>';
               $outcome = 'fail';
           } else {
               print $mfh ($file_content);
               close($mfh);
               &update_metadata_table($uri);
               $output .= '<p class="LC_success">';
               if ($caller eq 'transfer') {
                   $output .= &mt('Transferred data in added fields to notes');
               } else {
                   $output .= &mt('Wrote Metadata');
               }
               $output .= ' '.&Apache::lonlocal::locallocaltime(time).
                          '</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 class="LC_error">';
                   &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').'</p>';
           $outcome = 'fail';
     } else {      } else {
         &update_metadata_table($uri);          &update_metadata_table($uri);
         return '<p><font color="blue">'.&mt('Wrote Metadata').          $output = '<p class="LC_success">';
                   ' '.&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).
                      '</p>';
           $outcome = 'ok';
     }      }
       return ($outcome,$output);
 }  }
   
 sub update_metadata_table {  sub update_metadata_table {
     my ($uri) = @_;      my ($uri) = @_;
     my ($group,$file_name);      my ($type,$udom,$uname,$file_name,$group) =
     my ($udom,$uname,$remainder) =   &Apache::lonnet::parse_portfolio_url($uri);
         ($uri=~m -^/+(?:uploaded|editupload)/+($match_domain)/+($match_name)/+(.*)$-);  
   
     if ($remainder =~ /^groups\/(\w+)\/portfolio(\/.+)$/) {  
         $group = $1;  
         $file_name = $2;  
     } elsif ($remainder =~ /^portfolio(\/.+)$/) {  
         $file_name = $1;  
     }  
     $file_name =~ s/\.meta$//;      $file_name =~ s/\.meta$//;
     my $current_permissions =      my $current_permissions =
         &Apache::lonnet::get_portfile_permissions($udom,$uname);          &Apache::lonnet::get_portfile_permissions($udom,$uname);
     my %access_controls =      my %access_controls =
         &Apache::lonnet::get_access_controls($current_permissions,$group,          &Apache::lonnet::get_access_controls($current_permissions,$group,
                                              $group.$file_name);                                               $file_name);
     my $access_hash = $access_controls{$file_name};      my $access_hash = $access_controls{$file_name};
     my $available = 0;      my $available = 0;
     if (ref($access_hash) eq 'HASH') {      if (ref($access_hash) eq 'HASH') {
Line 1437  sub update_metadata_table { Line 1583  sub update_metadata_table {
     if ($available) {      if ($available) {
         my $result =          my $result =
             &Apache::lonnet::update_portfolio_table($uname,$udom,              &Apache::lonnet::update_portfolio_table($uname,$udom,
             $file_name,'portfolio_metadata',$group);              $file_name,'portfolio_metadata',$group,'update');
     }      }
 }  }
   
Line 1445  sub update_metadata_table { Line 1591  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.193  
changed lines
  Added in v.1.232


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.