Diff for /loncom/interface/lonmeta.pm between versions 1.163 and 1.203

version 1.163, 2006/08/04 22:14:38 version 1.203, 2007/01/23 04:25:56
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 170  sub authordisplay { Line 170  sub authordisplay {
     my ($aname,$adom)=@_;      my ($aname,$adom)=@_;
     return &Apache::loncommon::aboutmewrapper      return &Apache::loncommon::aboutmewrapper
         (&Apache::loncommon::plainname($aname,$adom),          (&Apache::loncommon::plainname($aname,$adom),
          $aname,$adom,'preview').' <tt>['.$aname.'@'.$adom.']</tt>';           $aname,$adom,'preview').' <tt>['.$aname.':'.$adom.']</tt>';
 }  }
   
 # Pretty display  # Pretty display
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 287  sub portfolio_linked_path { Line 281  sub portfolio_linked_path {
     if ($group) {      if ($group) {
  $start = "groups/$group/".$start;   $start = "groups/$group/".$start;
     }      }
     my $result = &Apache::portfolio::make_anchor($port_path,$start,'/');      my %anchor_fields = (
               'selectfile'  => $start,
           'currentpath' => '/'
       );
       my $result = &Apache::portfolio::make_anchor($port_path,\%anchor_fields,$start);
     my $fullpath = '/';      my $fullpath = '/';
     my (undef,@tree) = split('/',$path);      my (undef,@tree) = split('/',$path);
     my $filename = pop(@tree);      my $filename = pop(@tree);
     foreach my $dir (@tree) {      foreach my $dir (@tree) {
  $fullpath .= $dir.'/';   $fullpath .= $dir.'/';
  $result .= '/';   $result .= '/';
  $result .= &Apache::portfolio::make_anchor($port_path,$dir,$fullpath);   my %anchor_fields = (
               'selectfile'  => $dir,
               'currentpath' => $fullpath
           );
    $result .= &Apache::portfolio::make_anchor($port_path,\%anchor_fields,$dir);
     }      }
     $result .= "/$filename";      $result .= "/$filename";
     return $result;      return $result;
Line 358  sub pre_select_course { Line 359  sub pre_select_course {
     $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').'" />');
       $r->print('<input type="hidden" name="currentpath" value="'.$env{'form.currentpath'}.'" />');
       $r->print('<input type="hidden" name="associate" value="true" />');
     $r->print('</form>');      $r->print('</form>');
           
     my ($port_path,$group) = &get_port_path_and_group($uri);      my ($port_path,$group) = &get_port_path_and_group($uri);
     $r->print('<br /><br /><form method="POST" action="'.$port_path.'">'.      my $group_input;
       if ($group) {
           $group_input = '<input type="hidden" name="group" value="'.$group.'" />';
       } 
       $r->print('<br /><br /><form method="post" action="'.$port_path.'">'.
               '<input type="hidden" name="currentpath" value="'.$path.'" />'.                '<input type="hidden" name="currentpath" value="'.$path.'" />'.
       '<input type="hidden" name="group" value="'.$group.'" />'.        $group_input.
       '<input type="submit" name="cancel" value="'.&mt('Cancel').'">'.        '<input type="submit" name="cancel" value="'.&mt('Cancel').'" />'.
       '</form>');        '</form>');
   
     return;      return;
Line 376  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 441  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 461  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 498  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 505  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 584  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 596  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 611  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 706  sub prettyinput { Line 762  sub prettyinput {
 # Main Handler  # Main Handler
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
     #      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
            ['currentpath','changecourse']);
     my $uri=$r->uri;      my $uri=$r->uri;
     #      #
     # Set document type      # Set document type
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
     #  
     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/|) {
           $r->print(&Apache::loncommon::start_page('Edit Group Portfolio File Catalog Information',
    undef,
    {'domain' => $resdomain,}));
           &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 nformation',
Line 760  sub report_bombs { Line 831  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 807  sub present_uneditable_metadata { Line 878  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 1028  sub print_dynamic_metadata { Line 1098  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 1091  sub print_dynamic_metadata { Line 1161  sub print_dynamic_metadata {
 #####################################################  #####################################################
 #####################################################  #####################################################
 sub present_editable_metadata {  sub present_editable_metadata {
     my ($r,$uri, $file_type) = @_;      my ($r,$uri,$file_type) = @_;
     # Construction Space Call      # Construction Space Call
     # Header      # Header
     my $disuri=$uri;      my $disuri=$uri;
Line 1132  sub present_editable_metadata { Line 1202  sub present_editable_metadata {
  my $goback=&mt('Back to Source File');   my $goback=&mt('Back to Source File');
         $r->print(<<ENDBOMBS);          $r->print(<<ENDBOMBS);
 <h1>$disuri</h1>  <h1>$disuri</h1>
 <form method="post" name="defaultmeta">  <form method="post" action="" name="defaultmeta">
 ENDBOMBS  ENDBOMBS
         if ($showdel) {          if ($showdel) {
     $r->print(<<ENDDEL);      $r->print(<<ENDDEL);
Line 1140  ENDBOMBS Line 1210  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 {
Line 1160  ENDDEL Line 1235  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" name="defaultmeta">  <form method="post" action="" name="defaultmeta">
 ENDEDIT  ENDEDIT
         $r->print('<script language="JavaScript">'.          $r->print('<script type="JavaScript">'.
                   &Apache::loncommon::browser_and_searcher_javascript().                    &Apache::loncommon::browser_and_searcher_javascript().
                   '</script>');                    '</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',          if ($file_type eq 'groups') {
                 'highestgradelevel','standards');              $Apache::lonpublisher::metadatafields{'courserestricted'}=
  } else {                  'course.'.$env{'request.course.id'};
     @fields = ('author','title','subject','keywords','abstract','notes',  
                  'copyright','customdistributionfile','language',  
                  'standards',  
                  'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',  
                  'obsolete','obsoletereplacement');  
         }          }
         if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) &&          if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) &&
                 (! $env{'form.new_courserestricted'})) {                  (! $env{'form.new_courserestricted'}) && (! $file_type eq 'groups')) {
             $Apache::lonpublisher::metadatafields{'courserestricted'}=              $Apache::lonpublisher::metadatafields{'courserestricted'}=
                 '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';
         }          }
  if ($file_type eq 'portfolio') {   if (($file_type eq 'portfolio') || ($file_type eq 'groups'))  {
     if (! $Apache::lonpublisher::metadatafields{'mime'}) {      if (! $Apache::lonpublisher::metadatafields{'mime'}) {
                 ($Apache::lonpublisher::metadatafields{'mime'}) =                  ($Apache::lonpublisher::metadatafields{'mime'}) =
     ( $target=~/\.(\w+)$/ );      ( $target=~/\.(\w+)$/ );
Line 1202  ENDEDIT Line 1313  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{'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">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));      
             } 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));  
     } 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>');  
  }  
     }  
  }   }
   
  $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('Store 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('</form>              $r->print('<input type="hidden" name="currentpath" value="'.$env{'form.currentpath'}.'" />');
                <br /><br /><form method="POST" action="'.$port_path.'">'.      $r->print('</form><br /><br /><form method="post" action="'.$port_path.'">');
       '<input type="hidden" name="group" value="'.$group.'" />'.      if ($group ne '') {
       '<input type="hidden" name="currentpath" value="'.$path.'" />'.          $r->print('<input type="hidden" name="group" value="'.$group.'" />');
       '<input type="submit" name="cancel" value="'.&mt('Discard Edits and Return to Portfolio').'">');              }
       $r->print('<input type="hidden" name="currentpath" value="'.$path.'" />'.
         '<input type="submit" name="cancel" value="'.&mt('Discard Edits and Return to Portfolio').'" />');
  }   }
     }      }
           
Line 1310  ENDEDIT Line 1409  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.163  
changed lines
  Added in v.1.203


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.