Diff for /loncom/interface/lonmeta.pm between versions 1.172 and 1.210

version 1.172, 2006/08/21 19:26:27 version 1.210, 2008/01/23 17:23:16
Line 39  use Apache::lonpublisher; Line 39  use Apache::lonpublisher;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmysql;  use Apache::lonmysql;
 use Apache::lonmsg;  use Apache::lonmsg;
 use lib '/home/httpd/lib/perl/';  use LONCAPA qw(:DEFAULT :match);
 use LONCAPA;  
   
   
 ############################################################  ############################################################
Line 63  use LONCAPA; Line 62  use LONCAPA;
 ############################################################  ############################################################
 sub get_dynamic_metadata_from_sql {  sub get_dynamic_metadata_from_sql {
     my ($url) = shift();      my ($url) = shift();
     my ($authordom,$author)=($url=~m:^/res/(\w+)/(\w+)/:);      my ($authordom,$author)=($url=~m{^/res/($match_domain)/($match_username)/});
     if (! defined($authordom)) {      if (! defined($authordom)) {
         $authordom = shift();          $authordom = shift();
     }      }
Line 95  sub get_dynamic_metadata_from_sql { Line 94  sub get_dynamic_metadata_from_sql {
         while (my $result = <$fh>) {          while (my $result = <$fh>) {
             chomp($result);              chomp($result);
             next if (! $result);              next if (! $result);
             my %hash=&LONCAPA::lonmetadata::metadata_col_to_hash(map { &unescape($_) } split(/\,/,$result));              my %hash=&LONCAPA::lonmetadata::metadata_col_to_hash('metadata',
    map { &unescape($_) } split(/\,/,$result));
             foreach my $key (keys(%hash)) {              foreach my $key (keys(%hash)) {
                 $ReturnHash{$hash{'url'}}->{$key}=$hash{$key};                  $ReturnHash{$hash{'url'}}->{$key}=$hash{$key};
             }              }
Line 111  sub get_dynamic_metadata_from_sql { Line 111  sub get_dynamic_metadata_from_sql {
 sub dynamicmeta {  sub dynamicmeta {
     my $url=&Apache::lonnet::declutter(shift);      my $url=&Apache::lonnet::declutter(shift);
     $url=~s/\.meta$//;      $url=~s/\.meta$//;
     my ($adomain,$aauthor)=($url=~/^(\w+)\/(\w+)\//);      my ($adomain,$aauthor)=($url=~/^($match_domain)\/($match_username)\//);
     my $regexp=$url;      my $regexp=$url;
     $regexp=~s/(\W)/\\$1/g;      $regexp=~s/(\W)/\\$1/g;
     $regexp='___'.$regexp.'___';      $regexp='___'.$regexp.'___';
Line 235  sub fieldnames { Line 235  sub fieldnames {
          'lowestgradelevel' => 'Lowest Grade Level',           'lowestgradelevel' => 'Lowest Grade Level',
          'highestgradelevel' => 'Highest Grade Level');           'highestgradelevel' => 'Highest Grade Level');
           
     if (! defined($file_type) || $file_type ne 'portfolio') {      if ( !defined($file_type) || ($file_type ne 'portfolio' && $file_type ne 'groups') ) {
         %fields =   
     (%fields,  
      'courserestricted' => 'Course Restricting Metadata');  
     }  
            
     if (! defined($file_type) || $file_type ne 'portfolio') {  
         %fields =           %fields = 
         (%fields,          (%fields,
          'domain' => 'Domain',           'domain' => 'Domain',
Line 271  sub fieldnames { Line 265  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 389  sub select_course { Line 383  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 454  sub prettyprint { Line 481  sub prettyprint {
  ($type eq 'owner') ||   ($type eq 'owner') ||
  ($type eq 'modifyinguser') ||   ($type eq 'modifyinguser') ||
  ($type eq 'authorspace')) {   ($type eq 'authorspace')) {
  $value=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse;   $value=~s/($match_username)(\:|\@)($match_domain)/&authordisplay($1,$3)/gse;
  return $value;   return $value;
     }      }
     # Gradelevel      # Gradelevel
Line 474  sub prettyprint { Line 501  sub prettyprint {
  ($type eq 'sequsage_list') ||   ($type eq 'sequsage_list') ||
  ($type eq 'dependencies')) {   ($type eq 'dependencies')) {
  return '<font size="-1"><ul>'.join("\n",map {   return '<font size="-1"><ul>'.join("\n",map {
             my $url = &Apache::lonnet::clutter($_);              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 '') {
                 $title = 'Untitled';                  $title = 'Untitled';
Line 511  sub prettyprint { Line 538  sub prettyprint {
     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='<font size="-1"><ul>';
    my %descriptions;
         foreach my $course (@Courses) {          foreach my $course (@Courses) {
             my %courseinfo =              my %courseinfo =
  &Apache::lonnet::coursedescription($course,   &Apache::lonnet::coursedescription($course,
Line 518  sub prettyprint { Line 546  sub prettyprint {
             if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') {              if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') {
                 next;                  next;
             }              }
             $Str .= '<li><a href="/public/'.$courseinfo{'domain'}.'/'.      $descriptions{join('\0',@courseinfo{'domain','description'})} .= 
    '<li><a href="/public/'.$courseinfo{'domain'}.'/'.
                 $courseinfo{'num'}.'/syllabus" target="preview">'.                  $courseinfo{'num'}.'/syllabus" target="preview">'.
                 $courseinfo{'description'}.'</a></li>';                  $courseinfo{'description'}.' ('.$courseinfo{'domain'}.
    ')</a></li>';
         }          }
    foreach my $course (sort {lc($a) cmp lc($b)} (keys(%descriptions))) {
       $Str .= $descriptions{$course};
    }
   
  return $Str.'</ul></font>';   return $Str.'</ul></font>';
     }      }
     # No pretty print found      # No pretty print found
Line 597  sub prettyinput { Line 631  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 609  sub prettyinput { Line 650  sub prettyinput {
         }          }
         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_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 624  sub prettyinput { Line 667  sub prettyinput {
                       $relatedvalue);                         $relatedvalue); 
             }              }
             return ($output);              return ($output);
         }          } 
         if (($type eq 'lowestgradelevel') ||          if (($type eq 'lowestgradelevel') ||
     ($type eq 'highestgradelevel')) {      ($type eq 'highestgradelevel')) {
     return &Apache::loncommon::select_level_form($value,$fieldname).      return &Apache::loncommon::select_level_form($value,$fieldname).
Line 720  sub prettyinput { Line 763  sub prettyinput {
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
          ['currentpath']);           ['currentpath','changecourse']);
     my $uri=$r->uri;      my $uri=$r->uri;
     #      #
     # Set document type      # Set document type
Line 728  sub handler { Line 771  sub handler {
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
     my ($resdomain,$resuser)=      my ($resdomain,$resuser)=
         (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);          (&Apache::lonnet::declutter($uri)=~/^($match_domain)\/($match_username)\//);
     if ($uri=~m:/adm/bombs/(.*)$:) {      if ($uri=~m:/adm/bombs/(.*)$:) {
         $r->print(&Apache::loncommon::start_page('Error Messages'));          $r->print(&Apache::loncommon::start_page('Error Messages'));
         # Looking for all bombs?          # Looking for all bombs?
         &report_bombs($r,$uri);          &report_bombs($r,$uri);
     } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/portfolio/|) {      } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/portfolio/|) {
     ($resdomain,$resuser)=      ($resdomain,$resuser)=
  (&Apache::lonnet::declutter($uri)=~m|^(\w+)/(\w+)/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 Catalog Information',
  undef,   undef,
  {'domain' => $resdomain,}));   {'domain' => $resdomain,}));
         if ($env{'form.store'}) {          if ($env{'form.store'}) {
             &present_editable_metadata($r,$uri,'portfolio');              &present_editable_metadata($r,$uri,'portfolio');
         } else {          } else {
             &pre_select_course($r,$uri);              my $fn=&Apache::lonnet::filelocation('',$uri);
               %Apache::lonpublisher::metadatafields=();
               %Apache::lonpublisher::metadatakeys=();
               my $result=&Apache::lonnet::getfile($fn);
               &Apache::lonpublisher::metaeval($result);
               if ((!$Apache::lonpublisher::metadatafields{'courserestricted'}) ||
                   ($env{'form.changecourse'} eq 'true')) {
                   &pre_select_course($r,$uri);
               } else {
                   &present_editable_metadata($r,$uri,'portfolio');
               }
         }          }
     } 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 Catalog Information',
  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 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 {
Line 779  sub report_bombs { Line 833  sub report_bombs {
     $uri =~ s:/adm/bombs/::;      $uri =~ s:/adm/bombs/::;
     $uri = &Apache::lonnet::declutter($uri);      $uri = &Apache::lonnet::declutter($uri);
     $r->print('<h1>'.&Apache::lonnet::clutter($uri).'</h1>');      $r->print('<h1>'.&Apache::lonnet::clutter($uri).'</h1>');
     my ($domain,$author)=($uri=~/^(\w+)\/(\w+)\//);      my ($domain,$author)=($uri=~/^($match_domain)\/($match_username)\//);
     if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) {      if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) {
  if ($env{'form.clearbombs'}) {   if ($env{'form.clearbombs'}) {
     &Apache::lonmsg::clear_author_res_msg($uri);      &Apache::lonmsg::clear_author_res_msg($uri);
Line 826  sub present_uneditable_metadata { Line 880  sub present_uneditable_metadata {
     # displayed url      # displayed url
     my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/);      my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/);
     $uri=~s/\.meta$//;      $uri=~s/\.meta$//;
     my $disuri=&Apache::lonnet::clutter($uri);      my $disuri=&Apache::lonnet::clutter_with_no_wrapper($uri);
     $disuri=~s/^\/adm\/wrapper//;  
     # version      # version
     my $versiondisplay='';      my $versiondisplay='';
     if (!$uploaded) {      if (!$uploaded) {
Line 973  sub print_dynamic_metadata { Line 1026  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 1021  sub print_dynamic_metadata { Line 1074  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 1047  sub print_dynamic_metadata { Line 1100  sub print_dynamic_metadata {
     } else {      } else {
         $r->print('<h4>'.&mt('No Evaluation Data is available for this resource.').'</h4>');          $r->print('<h4>'.&mt('No Evaluation Data is available for this resource.').'</h4>');
     }      }
     $uri=~/^\/res\/(\w+)\/(\w+)\//;       $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})) {
         if (exists($dynmeta{'comments'})) {          if (exists($dynmeta{'comments'})) {
Line 1159  ENDBOMBS Line 1212  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('Catalog Information for').' '.$disuri;
         if ($disuri=~/\/default$/) {          if ($disuri=~/\/default$/) {
             my $dir=$disuri;              my $dir=$disuri;
             $dir=~s/default$//;              $dir=~s/default$//;
Line 1179  ENDDEL Line 1237  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;
  if ($file_type eq 'portfolio') {   my $added_metadata_fields;
     @fields =  ('author','title','subject','keywords','abstract',   my @added_order;
  'notes','lowestgradelevel',  
                 'highestgradelevel','standards');  
  } else {  
     @fields = ('author','title','subject','keywords','abstract','notes',  
                  'copyright','customdistributionfile','language',  
                  'standards',  
                  'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',  
                  'obsolete','obsoletereplacement');  
         }  
         if ($file_type eq 'groups') {          if ($file_type eq 'groups') {
             $Apache::lonpublisher::metadatafields{'courserestricted'}=              $Apache::lonpublisher::metadatafields{'courserestricted'}=
                 'course.'.$env{'request.course.id'};                   'course.'.$env{'request.course.id'};
         }          }
         if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) &&          if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) &&
                 (! $env{'form.new_courserestricted'}) && (! $file_type eq 'groups')) {                  (! $env{'form.new_courserestricted'}) && (! $file_type eq 'groups')) {
Line 1210  ENDEDIT Line 1272  ENDEDIT
                 'none';                  'none';
         } elsif ($env{'form.new_courserestricted'}) {          } elsif ($env{'form.new_courserestricted'}) {
             $Apache::lonpublisher::metadatafields{'courserestricted'}=              $Apache::lonpublisher::metadatafields{'courserestricted'}=
                 $env{'form.new_courserestricted'};                   $env{'form.new_courserestricted'};
         }                     }
    if ($file_type eq 'portfolio' || $file_type eq 'groups') {
       if(exists ($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'})) {
           # retrieve fieldnames (in order) from the course restricted list
           @fields = (split(/,/,$env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'}));
       } else {
           # no saved field list, use default list
           @fields =  ('author','title','subject','keywords','abstract',
       'notes','lowestgradelevel',
                       'highestgradelevel','standards');
                   if ($Apache::lonpublisher::metadatafields{'courserestricted'} =~ /^course\.($match_domain\_$match_courseid)$/) {
                       my $assoc_crs = $1;
               $added_metadata_fields = &Apache::lonparmset::get_added_meta_fieldnames($assoc_crs);
               if ($env{'course.'.$assoc_crs.'.metadata.addedorder'}) {
                   @added_order = split(/,/,$env{'course.'.$assoc_crs.'.metadata.addedorder'});
               }
               $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'} = join(",",@fields);
                   }
       }
    } else {
       @fields = ('author','title','subject','keywords','abstract','notes',
          'copyright','customdistributionfile','language',
          'standards',
          'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',
          'obsolete','obsoletereplacement');
           }
         if (! $Apache::lonpublisher::metadatafields{'copyright'}) {          if (! $Apache::lonpublisher::metadatafields{'copyright'}) {
                 $Apache::lonpublisher::metadatafields{'copyright'}=                  $Apache::lonpublisher::metadatafields{'copyright'}=
     'default';      'default';
Line 1225  ENDEDIT Line 1312  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') {
  $r->print(&mt('Associated with course [_1]','<strong>'.$env{$Apache::lonpublisher::metadatafields{'courserestricted'}.".description"}.  
       '</strong>').'<br />');                  if ($file_type eq 'portfolio') {
       $r->print(&mt('Associated with course [_1]',
           '<strong><a href="'.$uri.'?changecourse=true">'.
           $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.
           ".description"}.
         '</a></strong>').'<br />');
                   } else {
                       $r->print(&mt('Associated with course [_1]',
                           '<strong>'.
     $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.
                           ".description"}.'</strong>').'<br />');
                   }
     } else {      } else {
  $r->print("This resource is not associated with a course.<br />");   $r->print('<a href="'.$uri.'?changecourse=true">'.&mt('This resource is not associated with a course.').'</a><br />');
     }      }
  }   }
    if (@added_order) {
       foreach my $field_name (@added_order) {
                   push(@fields,$field_name);
                   $lt{$field_name} = $$added_metadata_fields{$field_name};
       }
    } else {
               foreach my $field_name (keys(%$added_metadata_fields)) {
                   push(@fields,$field_name);
                   $lt{$field_name} = $$added_metadata_fields{$field_name};
               }
           }
           $output .= &Apache::loncommon::start_data_table();
           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'})) {
                 # handle restrictions here                  # handle restrictions here
                 if (($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'} =~ m/active/) ||                  if ((($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'} =~ m/active/) ||
                     ($field_name eq 'courserestricted')){                      ($field_name eq 'courserestricted'))&&
                     $output.=("\n".'<p>'.$lt{$field_name}.': '.                      (!($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/))){
                       
                       $output .= "\n".&Apache::loncommon::start_data_table_row();
                       $output .= ('<td><span class="LC_metadata">'.$lt{$field_name}.':</span></td><td> '.
                               &prettyinput($field_name,                                &prettyinput($field_name,
    $Apache::lonpublisher::metadatafields{$field_name},     $Apache::lonpublisher::metadatafields{$field_name},
                     'new_'.$field_name,'defaultmeta',                      'new_'.$field_name,'defaultmeta',
                     undef,undef,undef,undef,                      undef,undef,undef,undef,
                     $Apache::lonpublisher::metadatafields{'courserestricted'}).'</p>'."\n");                      $Apache::lonpublisher::metadatafields{'courserestricted'}).'</td>');
                       $output .= &Apache::loncommon::end_data_table_row();
                  }                   }
             } else {              } else {
   
                     $output.=('<p>'.$lt{$field_name}.': '.                      $output.=(&Apache::loncommon::start_data_table_row().'<td><span class="LC_metadata">'.$lt{$field_name}.':</span></td><td> '.
                             &prettyinput($field_name,        &prettyinput($field_name,
    $Apache::lonpublisher::metadatafields{$field_name},     $Apache::lonpublisher::metadatafields{$field_name},
    'new_'.$field_name,'defaultmeta').'</p>');     'new_'.$field_name,'defaultmeta').'</td>'.&Apache::loncommon::end_data_table_row());
                                 
             }              }
         }          }
           $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 (sort keys %Apache::lonpublisher::metadatafields) {  
  next if ($_ =~ /\./);  
  my $unikey=$_;  
  $unikey=~/^([A-Za-z]+)/;  
  my $tag=$1;  
  $tag=~tr/A-Z/a-z/;  
  $file_content.= "\n\<$tag";  
  foreach (split(/\,/,  
        $Apache::lonpublisher::metadatakeys{$unikey})  
  ) {  
     my $value=  
  $Apache::lonpublisher::metadatafields{$unikey.'.'.$_};  
     $value=~s/\"/\'\'/g;  
     $file_content.=' '.$_.'="'.$value.'"' ;  
     # print $mfh ' '.$_.'="'.$value.'"';  
  }  
  $file_content.= '>'.  
     &HTML::Entities::encode  
     ($Apache::lonpublisher::metadatafields{$unikey},  
      '<>&"').  
      '</'.$tag.'>';  
     }  
     if ($fn =~ m|^$Apache::lonnet::perlvar{'lonDocRoot'}/userfiles/portfolio/|) {  
  my ($path, $new_fn) = ($fn =~ m|/(portfolio.*)/([^/]*)$|);  
                 $r->print(&store_portfolio_metadata($formname,$file_content,$path,  
                                                     $new_fn));  
                 unless ($env{'form.associate'}) {  
                     $r->print(&Apache::portfolio::done("Return to Portfolio",'/adm/portfolio'));  
                     return;  
                 }    
             } elsif ($fn =~  m|^$Apache::lonnet::perlvar{'lonDocRoot'}/userfiles/groups/\w+/portfolio/|) {  
                 my ($path, $new_fn) = ($fn =~ m|/(groups/\w+/portfolio.*)/([^/]*)$|);  
                 $r->print(&store_portfolio_metadata($formname,$file_content,$path,$new_fn));  
                 unless ($env{'form.associate'}) {  
                     $r->print(&Apache::portfolio::done("Return to Portfolio",'/adm/portfolio'));  
                     return;  
                 }    
     } 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;  
     $r->print('<p><font color="blue">'.&mt('Wrote Metadata').  
       ' '.&Apache::lonlocal::locallocaltime(time).  
       '</font></p>');  
  }  
                 unless ($env{'form.associate'}) {  
                     $r->print(&Apache::portfolio::done("Return to Portfolio",'/adm/portfolio'));  
                     return;  
                 }    
     }  
  }   }
   
  $r->print($output.'<br /><input type="submit" name="store" value="'.   $r->print($output.'<br /><input type="submit" name="store" value="'.
                   &mt('Store Catalog Information').'" />');                    &mt('Save Catalog Information').'" />');
   
  if ($file_type eq 'portfolio') {   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);
             if ($group) {              if ($group ne '') {
                 $r->print('<input type="hidden" name="group" value="'.$group.'" />');                  $r->print('<input type="hidden" name="group" value="'.$group.'" />');
             }              }
             $r->print('<input type="hidden" name="currentpath" value="'.$env{'form.currentpath'}.'" />');              $r->print('<input type="hidden" name="currentpath" value="'.$env{'form.currentpath'}.'" />');
     $r->print('</form>      $r->print('</form><br /><br /><form method="post" action="'.$port_path.'">');
                <br /><br /><form method="post" action="'.$port_path.'">'.      if ($group ne '') {
       '<input type="hidden" name="group" value="'.$group.'" />'.          $r->print('<input type="hidden" name="group" value="'.$group.'" />');
       '<input type="hidden" name="currentpath" value="'.$path.'" />'.              }
       $r->print('<input type="hidden" name="currentpath" value="'.$path.'" />'.
       '<input type="submit" name="cancel" value="'.&mt('Discard Edits and Return to Portfolio').'" />');        '<input type="submit" name="cancel" value="'.&mt('Discard Edits and Return to Portfolio').'" />');
  }   }
     }      }
Line 1346  ENDEDIT Line 1413  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) = @_;      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 {
         return '<p><font color="blue">'.&mt('Wrote Metadata').          &update_metadata_table($uri);
                   ' '.&Apache::lonlocal::locallocaltime(time).'</font></p>';          $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 update_metadata_table {
       my ($uri) = @_;
       my ($type,$udom,$uname,$file_name,$group) =
    &Apache::lonnet::parse_portfolio_url($uri);
       $file_name =~ s/\.meta$//;
       my $current_permissions =
           &Apache::lonnet::get_portfile_permissions($udom,$uname);
       my %access_controls =
           &Apache::lonnet::get_access_controls($current_permissions,$group,
                                                $file_name);
       my $access_hash = $access_controls{$file_name};
       my $available = 0;
       if (ref($access_hash) eq 'HASH') {
           foreach my $key (keys(%{$access_hash})) {
               my ($num,$scope,$end,$start) =
                   ($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/);
               if ($scope eq 'public' || $scope eq 'guest') {
                   $available = 1;
                   last;
               }
           }
       }
       if ($available) {
           my $result =
               &Apache::lonnet::update_portfolio_table($uname,$udom,
               $file_name,'portfolio_metadata',$group,'update');
     }      }
 }  }
   
   
 1;  1;
 __END__  __END__
   

Removed from v.1.172  
changed lines
  Added in v.1.210


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.