Diff for /loncom/interface/lonmeta.pm between versions 1.78 and 1.145

version 1.78, 2004/06/11 02:21:45 version 1.145, 2005/12/19 21:33:54
Line 17 Line 17
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.  # GNU General Public License for more details.
 #  #
 # You should have received a copy of the GNU General Public License  # You should have received a copy of the GNU General Public License 
 # along with LON-CAPA; if not, write to the Free Software  # along with LON-CAPA; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #  #
Line 31  package Apache::lonmeta; Line 31  package Apache::lonmeta;
 use strict;  use strict;
 use LONCAPA::lonmetadata();  use LONCAPA::lonmetadata();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::lonnet();  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon(); 
 use Apache::lonmsg;  use Apache::lonmsg;
 use Apache::lonpublisher;  use Apache::lonpublisher;
 use Apache::lonlocal;  use Apache::lonlocal;
Line 41  use Apache::lonmysql; Line 41  use Apache::lonmysql;
 use Apache::lonmsg;  use Apache::lonmsg;
   
   
   ############################################################
   ############################################################
   ##
   ## &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 {
       my ($url) = shift();
       my ($authordom,$author)=($url=~m:^/res/(\w+)/(\w+)/:);
       if (! defined($authordom)) {
           $authordom = shift();
       }
       if  (! defined($author)) { 
           $author = shift();
       }
       if (! defined($authordom) || ! defined($author)) {
           return ();
       }
       my @Fields = ('url','count','course',
                     'goto','goto_list',
                     'comefrom','comefrom_list',
                     'sequsage','sequsage_list',
                     'stdno','stdno_list',
     'dependencies',
                     'avetries','avetries_list',
                     'difficulty','difficulty_list',
                     'disc','disc_list',
                     'clear','technical','correct',
                     'helpful','depth');
       #
       my $query = 'SELECT '.join(',',@Fields).
           ' FROM metadata WHERE url LIKE "'.$url.'%"';
       my $server = &Apache::lonnet::homeserver($author,$authordom);
       my $reply = &Apache::lonnet::metadata_query($query,undef,undef,
                                                   ,[$server]);
       return () if (! defined($reply) || ref($reply) ne 'HASH');
       my $filename = $reply->{$server};
       if (! defined($filename) || $filename =~ /^error/) {
           return ();
       }
       my $max_time = time + 10; # wait 10 seconds for results at most
       my %ReturnHash;
       #
       # Look for results
       my $finished = 0;
       while (! $finished && time < $max_time) {
           my $datafile=$Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/'.$filename;
           if (! -e "$datafile.end") { next; }
           my $fh;
           if (!($fh=Apache::File->new($datafile))) { next; }
           while (my $result = <$fh>) {
               chomp($result);
               next if (! $result);
               my @Data = 
                   map { 
                       &Apache::lonnet::unescape($_); 
                   } split(',',$result);
               my $url = $Data[0];
               for (my $i=0;$i<=$#Fields;$i++) {
                   $ReturnHash{$url}->{$Fields[$i]}=$Data[$i];
               }
           }
           $finished = 1;
       }
       #
       return %ReturnHash;
   }
   
   
 # Fetch and evaluate dynamic metadata  # Fetch and evaluate dynamic metadata
 sub dynamicmeta {  sub dynamicmeta {
     my $url=&Apache::lonnet::declutter(shift);      my $url=&Apache::lonnet::declutter(shift);
Line 155  sub diffgraph { Line 236  sub diffgraph {
   
 # The field names  # The field names
 sub fieldnames {  sub fieldnames {
     return &Apache::lonlocal::texthash      my $file_type=shift;
         (      my %fields = 
          'title' => 'Title',          ('title' => 'Title',
          'author' =>'Author(s)',           'author' =>'Author(s)',
          'authorspace' => 'Author Space',           'authorspace' => 'Author Space',
          'modifyinguser' => 'Last Modifying User',           'modifyinguser' => 'Last Modifying User',
          'subject' => 'Subject',           'subject' => 'Subject',
            'standards' => 'Standards',
          'keywords' => 'Keyword(s)',           'keywords' => 'Keyword(s)',
          'notes' => 'Notes',           'notes' => 'Notes',
          'abstract' => 'Abstract',           'abstract' => 'Abstract',
          'lowestgradelevel' => 'Lowest Grade Level',           'lowestgradelevel' => 'Lowest Grade Level',
          'highestgradelevel' => 'Highest Grade Level',           'highestgradelevel' => 'Highest Grade Level',
          'standards' => 'Standards',           'courserestricted' => 'Course Restricting Metadata');
            
       if (! defined($file_type) || $file_type ne 'portfolio') {
           %fields = 
           (%fields,
            'domain' => 'Domain',
          'mime' => 'MIME Type',           'mime' => 'MIME Type',
          'language' => 'Language',           'language' => 'Language',
          'creationdate' => 'Creation Date',           'creationdate' => 'Creation Date',
Line 175  sub fieldnames { Line 262  sub fieldnames {
          'owner' => 'Publisher/Owner',           'owner' => 'Publisher/Owner',
          'copyright' => 'Copyright/Distribution',           'copyright' => 'Copyright/Distribution',
          'customdistributionfile' => 'Custom Distribution File',           'customdistributionfile' => 'Custom Distribution File',
          'sourceavail' => 'Source Availible',           'sourceavail' => 'Source Available',
          'sourcerights' => 'Source Custom Distribution File',           'sourcerights' => 'Source Custom Distribution File',
          'obsolete' => 'Obsolete',           'obsolete' => 'Obsolete',
          'obsoletereplacement' => 'Suggested Replacement for Obsolete File',           'obsoletereplacement' => 'Suggested Replacement for Obsolete File',
Line 197  sub fieldnames { Line 284  sub fieldnames {
          'stdno'      => 'Total number of students who have worked on this problem',           'stdno'      => 'Total number of students who have worked on this problem',
          'difficulty' => 'Degree of difficulty',           'difficulty' => 'Degree of difficulty',
          'disc'       => 'Degree of discrimination',           'disc'       => 'Degree of discrimination',
        'dependencies' => 'Resources used by this resource',
          );           );
       }
       return &Apache::lonlocal::texthash(%fields);
   }
   
   sub portfolio_display_uri {
       my ($uri)=@_;
       $uri =~ s|.*/(portfolio/.*)$|$1|;
       my ($res_uri,$meta_uri) = ($uri,$uri);
   
       if ($uri =~ /\.meta$/) {
    $res_uri =~ s/\.meta//;
       } else {
    $meta_uri .= '.meta';
       }
       
       my ($path) = ($res_uri =~ m|(.*)/[^/]*$|);
       
       return ($res_uri,$meta_uri,$path);
 }  }
   
   sub pre_select_course {
       my ($r,$uri) = @_;
       my $output;
       my $fn=&Apache::lonnet::filelocation('',$uri);
       my ($res_uri,$meta_uri,$path) = &portfolio_display_uri($uri);
       %Apache::lonpublisher::metadatafields=();
       %Apache::lonpublisher::metadatakeys=();
       my $result=&Apache::lonnet::getfile($fn);
       if ($result == -1){
           $r->print(&mt('Creating new file [_1]'),$meta_uri);
       } else {
           &Apache::lonpublisher::metaeval($result);
       }
       $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>');
       $output = &select_course();
       $r->print($output.'<br /><input type="submit" name="store" value="'.
                     &mt('Associate Resource With Selected Course').'">');
       $r->print('</form>');
       
       $r->print('<br /><br /><form method="POST" action="/adm/portfolio">'.
                 '<input type="hidden" name="currentpath" value="'.$path.'" />'.
         '<input type="submit" name="cancel" value="'.&mt('Cancel').'">'.
         '</form>');
   
       return;
   }
   sub select_course {
       my %courses;
       my $output;
       my $selected;
       foreach my $key (keys (%env)) { 
           if ($key =~ m/\.metadata\./) {
               $key =~ m/^course\.(.+)(\.metadata.+$)/;
               my $course = $1;
               my $coursekey = 'course.'.$course.'.description';
               my $value = $env{$coursekey};
               $courses{$coursekey} = $value;
           }
       }
       &Apache::lonnet::logthis('the restricted is'.$Apache::lonpublisher::metadatafields{'courserestricted'});
       my $meta_not_found = 1;
       if ($Apache::lonpublisher::metadatafields{'courserestricted'} eq 'none') {
           $selected = ' SELECTED ';
       } else {
           $selected = '';
       }
       $output .= '<select name="new_courserestricted" >';
       $output .= '<option value="none" '.$selected.'>None</option>';
       foreach my $key (keys (%courses)) {    
           $key =~ m/(^.+)\.description$/;
           if ($Apache::lonpublisher::metadatafields{'courserestricted'} eq $1) {
               $selected = ' SELECTED ';
           } else {
               $selected = '';
           }
           $output .= '<option value="'.$1.'"'.$selected.'>';
           $output .= $courses{$key};
           $output .= '</option>';
       }
       $output .= '</select><br />';
       return ($output);
   }
 # Pretty printing of metadata field  # Pretty printing of metadata field
   
 sub prettyprint {  sub prettyprint {
     my ($type,$value)=@_;      my ($type,$value,$target,$prefix,$form,$noformat)=@_;
   # $target,$prefix,$form are optional and for filecrumbs only
     if (! defined($value)) {       if (! defined($value)) { 
         return '&nbsp;';           return '&nbsp;'; 
     }      }
Line 249  sub prettyprint { Line 419  sub prettyprint {
  return &Apache::loncommon::gradeleveldescription($value);   return &Apache::loncommon::gradeleveldescription($value);
     }      }
     # Only for advance users below      # Only for advance users below
     if (! $ENV{'user.adv'}) {       if (! $env{'user.adv'}) { 
         return '<i>- '.&mt('not displayed').' -</i>';          return '<i>- '.&mt('not displayed').' -</i>';
     }      }
     # File      # File
Line 257  sub prettyprint { Line 427  sub prettyprint {
  ($type eq 'obsoletereplacement') ||   ($type eq 'obsoletereplacement') ||
  ($type eq 'goto_list') ||   ($type eq 'goto_list') ||
  ($type eq 'comefrom_list') ||   ($type eq 'comefrom_list') ||
  ($type eq 'sequsage_list')) {   ($type eq 'sequsage_list') ||
  return join('<br />',map {   ($type eq 'dependencies')) {
    return '<ul><font size="-1">'.join("\n",map {
             my $url = &Apache::lonnet::clutter($_);              my $url = &Apache::lonnet::clutter($_);
             my $title = &Apache::lonnet::gettitle($url);              my $title = &Apache::lonnet::gettitle($url);
             if ($title eq '') {              if ($title eq '') {
Line 275  sub prettyprint { Line 446  sub prettyprint {
                     $title .= ' Syllabus';                      $title .= ' Syllabus';
                 }                   } 
             }              }
             $_ = '<b>'.$title.'</b> '.              $_ = '<li>'.$title.' '.
                 '<a href="'.$url.'" target="preview">'.   &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'-1',$noformat).
                 '<font size="-1">'.$url.'</font>'.                  '</li>'
                 '</a>'      } split(/\s*\,\s*/,$value)).'</ul></font>';
         } split(/\s*\,\s*/,$value));  
     }      }
     # Evaluations      # Evaluations
     if (($type eq 'clear') ||      if (($type eq 'clear') ||
Line 351  sub relatedfield { Line 521  sub relatedfield {
   
 sub prettyinput {  sub prettyinput {
     my ($type,$value,$fieldname,$formname,      my ($type,$value,$fieldname,$formname,
  $relatedsearchflag,$relatedsep,$relatedvalue,$size)=@_;   $relatedsearchflag,$relatedsep,$relatedvalue,$size,$course_key)=@_;
     if (! defined($size)) {      if (! defined($size)) {
         $size = 80;          $size = 80;
     }      }
       my $output;
       if (defined($course_key)) {
           my $stu_add;
           my $only_one;
           my %meta_options;
           my @cur_values_inst;
           my $cur_values_stu;
           my $values = $env{$course_key.'.metadata.'.$type.'.values'};
           if ($env{$course_key.'.metadata.'.$type.'.options'} =~ m/stuadd/) {
               $stu_add = 'true';
           }
           if ($env{$course_key.'.metadata.'.$type.'.options'} =~ m/onlyone/) {
               $only_one = 'true';
           }
           # need to take instructor values out of list where instructor and student
           # values may be mixed.
           if ($values) {
               foreach my $item (split(/,/,$values)) {
                   $item =~ s/^\s+//;
                   $meta_options{$item} = $item;
               }
               foreach my $item (split(/,/,$value)) {
                   $item =~ s/^\s+//;
                   if ($meta_options{$item}) {
                       push(@cur_values_inst,$item);
                   } else {
                       $cur_values_stu .= $item.',';
                   }
               }
           } else {
               $cur_values_stu = $value;
           }
           if ($type eq 'courserestricted') {
               return (&select_course());
               # return ('<input type="hidden" name="new_courserestricted" value="'.$course_key.'" />');
           }
           if (($type eq 'keywords') || ($type eq 'subject')
                || ($type eq 'author')||($type eq  'notes')
                || ($type eq  'abstract')|| ($type eq  'title')|| ($type eq  'standards')) {
               if ($values) {
                   if ($only_one) {
                       $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,%meta_options));
                   } else {
                       $output .= (&Apache::loncommon::multiple_select_form('new_'.$type,\@cur_values_inst,undef,\%meta_options));
                   }
               }
               if ($stu_add) {
                   $output .= '<input type="text" name="'.$fieldname.'" size="'.$size.'" '.
                   'value="'.$cur_values_stu.'" />'.
                   &relatedfield(1,$relatedsearchflag,$relatedsep,$fieldname,
                         $relatedvalue); 
               }
               return ($output);
           }
           if (($type eq 'lowestgradelevel') ||
       ($type eq 'highestgradelevel')) {
       return &Apache::loncommon::select_level_form($value,$fieldname).
               &relatedfield(0,$relatedsearchflag,$relatedsep); 
           }
           return(); 
       }
     # Language      # Language
     if ($type eq 'language') {      if ($type eq 'language') {
  return &selectbox($fieldname,   return &selectbox($fieldname,
Line 415  sub prettyinput { Line 646  sub prettyinput {
     ",'rights')\">".&mt('Select').'</a>'.      ",'rights')\">".&mt('Select').'</a>'.
             &relatedfield(0,$relatedsearchflag,$relatedsep);               &relatedfield(0,$relatedsearchflag,$relatedsep); 
     }      }
       if ($type eq 'courserestricted') {
           return (&select_course());
           #return ('<input type="hidden" name="new_courserestricted" value="'.$course_key.'" />');
       }
   
     # Dates      # Dates
     if (($type eq 'creationdate') ||      if (($type eq 'creationdate') ||
  ($type eq 'lastrevisiondate')) {   ($type eq 'lastrevisiondate')) {
Line 447  sub handler { Line 683  sub handler {
     #      #
     my ($resdomain,$resuser)=      my ($resdomain,$resuser)=
         (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);          (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);
     $r->print('<html><head><title>'.      my $html=&Apache::lonxml::xmlbegin();
       $r->print($html.'<head><title>'.
               'Catalog Information'.                'Catalog Information'.
               '</title></head>');                '</title></head>');
     if ($uri=~m:/adm/bombs/(.*)$:) {      if ($uri=~m:/adm/bombs/(.*)$:) {
         $r->print(&Apache::loncommon::bodytag('Error Messages'));          $r->print(&Apache::loncommon::bodytag('Error Messages'));
         # Looking for all bombs?          # Looking for all bombs?
         &report_bombs($r,$uri);          &report_bombs($r,$uri);
       } elsif ($uri=~/\/portfolio\//) {
       ($resdomain,$resuser)=
       (&Apache::lonnet::declutter($uri)=~m|^(\w+)/(\w+)/portfolio|);
           $r->print(&Apache::loncommon::bodytag
             ('Edit Portfolio File Information','','','',$resdomain));
           if ($env{'form.store'}) {
               &present_editable_metadata($r,$uri,'portfolio');
           } else {
               &pre_select_course($r,$uri);
           }
     } elsif ($uri=~/^\/\~/) {       } elsif ($uri=~/^\/\~/) { 
         # Construction space          # Construction space
         $r->print(&Apache::loncommon::bodytag          $r->print(&Apache::loncommon::bodytag
Line 461  sub handler { Line 708  sub handler {
         &present_editable_metadata($r,$uri);          &present_editable_metadata($r,$uri);
     } else {      } else {
         $r->print(&Apache::loncommon::bodytag          $r->print(&Apache::loncommon::bodytag
                   ('Catalog Information','','','',$resdomain));    ('Catalog Information','','','',$resdomain));
         &present_uneditable_metadata($r,$uri);          &present_uneditable_metadata($r,$uri);
     }      }
     $r->print('</body></html>');      $r->print('</body></html>');
Line 483  sub report_bombs { Line 730  sub report_bombs {
     $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=~/^(\w+)\/(\w+)\//);
     if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) {      if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) {
    if ($env{'form.clearbombs'}) {
       &Apache::lonmsg::clear_author_res_msg($uri);
    }
           my $clear=&mt('Clear all Messages in Subdirectory');
    $r->print(<<ENDCLEAR);
   <form method="post">
   <input type="submit" name="clearbombs" value="$clear" />
   </form>
   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 (sort(keys(%brokenurls))) {
Line 537  sub present_uneditable_metadata { Line 793  sub present_uneditable_metadata {
     # obsolete      # obsolete
     my $obsolete=$content{'obsolete'};      my $obsolete=$content{'obsolete'};
     my $obsoletewarning='';      my $obsoletewarning='';
     if (($obsolete) && ($ENV{'user.adv'})) {      if (($obsolete) && ($env{'user.adv'})) {
         $obsoletewarning='<p><font color="red">'.          $obsoletewarning='<p><font color="red">'.
             &mt('This resource has been marked obsolete by the author(s)').              &mt('This resource has been marked obsolete by the author(s)').
             '</font></p>';              '</font></p>';
Line 582  $disuri<br /> Line 838  $disuri<br />
 $obsoletewarning  $obsoletewarning
 $versiondisplay  $versiondisplay
 </p>  </p>
 <table cellspacing=2 border=0>  <table cellspacing="2" border="0">
 $table  $table
 </table>  </table>
 ENDHEAD  ENDHEAD
     if ($ENV{'user.adv'}) {      if ($env{'user.adv'}) {
         &print_dynamic_metadata($r,$uri,\%content);          &print_dynamic_metadata($r,$uri,\%content);
     }      }
     return;      return;
Line 604  sub print_dynamic_metadata { Line 860  sub print_dynamic_metadata {
     $r->rflush();      $r->rflush();
     my %items=&fieldnames();      my %items=&fieldnames();
     my %dynmeta=&dynamicmeta($uri);      my %dynmeta=&dynamicmeta($uri);
     &Apache::lonnet::logthis('dynamic metadata keys:'.$/.  
                              join("\n",keys(%dynmeta)));  
     #      #
     # General Access and Usage Statistics      # General Access and Usage Statistics
     if (exists($dynmeta{'count'}) ||      if (exists($dynmeta{'count'}) ||
Line 614  sub print_dynamic_metadata { Line 868  sub print_dynamic_metadata {
         exists($dynmeta{'goto'}) ||          exists($dynmeta{'goto'}) ||
         exists($dynmeta{'course'})) {          exists($dynmeta{'course'})) {
         $r->print('<h4>'.&mt('Access and Usage Statistics').'</h4>'.          $r->print('<h4>'.&mt('Access and Usage Statistics').'</h4>'.
                   '<table cellspacing=2 border=0>');                    '<table cellspacing="2" border="0">');
         foreach ('count',          foreach ('count',
                  'sequsage','sequsage_list',                   'sequsage','sequsage_list',
                  'comefrom','comefrom_list',                   'comefrom','comefrom_list',
Line 639  sub print_dynamic_metadata { Line 893  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>');                        '<table cellspacing="2" border="0">');
             $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{'stdno'}.'</td>'.              $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{'stdno'}.'</td>'.
                       '<td bgcolor="#CCCCCC">'.                        '<td bgcolor="#CCCCCC">'.
                       &prettyprint('stdno',$dynmeta{'stdno'}).                        &prettyprint('stdno',$dynmeta{'stdno'}).
Line 658  sub print_dynamic_metadata { Line 912  sub print_dynamic_metadata {
             $r->print('<h4>'.              $r->print('<h4>'.
                       &mt('Detailed Assessment Statistical Data').                        &mt('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>Course</th>'.
                 '<th>Section(s)</th>'.                  '<th>Section(s)</th>'.
Line 718  sub print_dynamic_metadata { Line 972  sub print_dynamic_metadata {
         exists($dynmeta{'correct'}) ||           exists($dynmeta{'correct'}) || 
         exists($dynmeta{'technical'})){           exists($dynmeta{'technical'})){ 
         $r->print('<h4>'.&mt('Evaluation Data').'</h4>'.          $r->print('<h4>'.&mt('Evaluation Data').'</h4>'.
                   '<table cellspacing=2 border=0>');                    '<table cellspacing="2" border="0">');
         foreach ('clear','depth','helpful','correct','technical') {          foreach ('clear','depth','helpful','correct','technical') {
             $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'.              $r->print('<tr><td bgcolor="#AAAAAA">'.$lt{$_}.'</td>'.
                       '<td bgcolor="#CCCCCC">'.                        '<td bgcolor="#CCCCCC">'.
Line 729  sub print_dynamic_metadata { Line 983  sub print_dynamic_metadata {
         $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\/(\w+)\/(\w+)\//; 
     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'})) {
             $r->print('<h4>'.&mt('Evaluation Comments').' ('.              $r->print('<h4>'.&mt('Evaluation Comments').' ('.
                       &mt('visible to author and co-authors only').                        &mt('visible to author and co-authors only').
Line 752  sub print_dynamic_metadata { Line 1006  sub print_dynamic_metadata {
     # 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>');                '</h3><table border="0" cellspacing="1">');
     foreach (sort(keys(%content))) {      foreach (sort(keys(%content))) {
         my $name=$_;          my $name=$_;
         if ($name!~/\.display$/) {          if ($name!~/\.display$/) {
Line 770  sub print_dynamic_metadata { Line 1024  sub print_dynamic_metadata {
                                                   $name.'.'.$_).'; ';                                                    $name.'.'.$_).'; ';
                 }                  }
             }              }
             $r->print('<b>'.$display.':</b> '.$content{$name});              $r->print('<tr><td bgcolor="#bbccbb"><font size="-1" color="#556655">'.$display.'</font></td><td bgcolor="#ccddcc"><font size="-1" color="#556655">'.$content{$name});
             if ($otherinfo) {              if ($otherinfo) {
                 $r->print(' ('.$otherinfo.')');                  $r->print(' ('.$otherinfo.')');
             }              }
             $r->print("<br />\n");              $r->print("</font></td></tr>\n");
         }          }
     }      }
       $r->print("</table>");
     return;      return;
 }  }
   
   
   
 #####################################################  #####################################################
 #####################################################  #####################################################
 ###                                               ###  ###                                               ###
Line 788  sub print_dynamic_metadata { Line 1045  sub print_dynamic_metadata {
 #####################################################  #####################################################
 #####################################################  #####################################################
 sub present_editable_metadata {  sub present_editable_metadata {
     my ($r,$uri) = @_;      my ($r,$uri, $file_type) = @_;
     # Construction Space Call      # Construction Space Call
     # Header      # Header
     my $disuri=$uri;      my $disuri=$uri;
     my $fn=&Apache::lonnet::filelocation('',$uri);      my $fn=&Apache::lonnet::filelocation('',$uri);
     $disuri=~s/^\/\~/\/priv\//;      $disuri=~s/^\/\~/\/priv\//;
     $disuri=~s/\.meta$//;      $disuri=~s/\.meta$//;
       my $meta_uri = $disuri;
       if ($disuri =~ m|/portfolio/|) {
    ($disuri, $meta_uri) =  &portfolio_display_uri($disuri);
       }
     my $target=$uri;      my $target=$uri;
     $target=~s/^\/\~/\/res\/$ENV{'request.role.domain'}\//;      $target=~s/^\/\~/\/res\/$env{'request.role.domain'}\//;
     $target=~s/\.meta$//;      $target=~s/\.meta$//;
     my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target);      my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target);
     if ($bombs) {      if ($bombs) {
         if ($ENV{'form.delmsg'}) {          my $showdel=1;
           if ($env{'form.delmsg'}) {
             if (&Apache::lonmsg::del_url_author_res_msg($target) eq 'ok') {              if (&Apache::lonmsg::del_url_author_res_msg($target) eq 'ok') {
                 $bombs=&mt('Messages deleted.');                  $bombs=&mt('Messages deleted.');
    $showdel=0;
             } else {              } else {
                 $bombs=&mt('Error deleting messages');                  $bombs=&mt('Error deleting messages');
             }              }
         }          }
         my $del=&mt('Delete Messages');          if ($env{'form.clearmsg'}) {
       my $cleardir=$target;
       $cleardir=~s/\/[^\/]+$/\//;
               if (&Apache::lonmsg::clear_author_res_msg($cleardir) eq 'ok') {
                   $bombs=&mt('Messages cleared.');
    $showdel=0;
               } else {
                   $bombs=&mt('Error clearing messages');
               }
           }
           my $del=&mt('Delete Messages for this Resource');
    my $clear=&mt('Clear all Messages in Subdirectory');
    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" name="defaultmeta">
 <input type="submit" name="delmsg" value="$del" />  
 <br />$bombs  
 ENDBOMBS  ENDBOMBS
           if ($showdel) {
       $r->print(<<ENDDEL);
   <input type="submit" name="delmsg" value="$del" />
   <input type="submit" name="clearmsg" value="$clear" />
   ENDDEL
           } else {
               $r->print('<a href="'.$disuri.'" />'.$goback.'</a>');
    }
    $r->print('<br />'.$bombs);
     } else {      } else {
         my $displayfile='Catalog Information for '.$disuri;          my $displayfile='Catalog Information for '.$disuri;
         if ($disuri=~/\/default$/) {          if ($disuri=~/\/default$/) {
Line 823  ENDBOMBS Line 1105  ENDBOMBS
                 &mt('Default Cataloging Information for Directory').' '.                  &mt('Default Cataloging Information for Directory').' '.
                 $dir;                  $dir;
         }          }
         my $bodytag=  
             &Apache::loncommon::bodytag('Edit Catalog Information');  
         %Apache::lonpublisher::metadatafields=();          %Apache::lonpublisher::metadatafields=();
         %Apache::lonpublisher::metadatakeys=();          %Apache::lonpublisher::metadatakeys=();
         &Apache::lonpublisher::metaeval(&Apache::lonnet::getfile($fn));          my $result=&Apache::lonnet::getfile($fn);
           if ($result == -1){
       $r->print(&mt('Creating new file [_1]'),$meta_uri);
           } else {
               &Apache::lonpublisher::metaeval($result);
           }
         $r->print(<<ENDEDIT);          $r->print(<<ENDEDIT);
 <html><head><title>Edit Catalog Information</title></head>  
 $bodytag  
 <h1>$displayfile</h1>  <h1>$displayfile</h1>
 <form method="post" name="defaultmeta">  <form method="post" name="defaultmeta">
 ENDEDIT  ENDEDIT
         $r->print('<script language="JavaScript">'.          $r->print('<script language="JavaScript">'.
                   &Apache::loncommon::browser_and_searcher_javascript.                    &Apache::loncommon::browser_and_searcher_javascript().
                   '</script>');                    '</script>');
         my %lt=&fieldnames();          my %lt=&fieldnames($file_type);
         foreach ('author','title','subject','keywords','abstract','notes',   my $output;
    my @fields;
    if ($file_type eq 'portfolio') {
       @fields =  ('author','title','subject','keywords','abstract','notes','lowestgradelevel',
                   'highestgradelevel','standards');
    } else {
       @fields = ('author','title','subject','keywords','abstract','notes',
                  'copyright','customdistributionfile','language',                   'copyright','customdistributionfile','language',
                  'standards',                   'standards',
                  'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',                   'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',
                  'obsolete','obsoletereplacement') {                   'obsolete','obsoletereplacement');
             if (defined($ENV{'form.new_'.$_})) {          }
                 $Apache::lonpublisher::metadatafields{$_}=          if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) &&
                     $ENV{'form.new_'.$_};                  (! $env{'form.new_courserestricted'})) {
             }              $Apache::lonpublisher::metadatafields{'courserestricted'}=
             if (! $Apache::lonpublisher::metadatafields{'copyright'}) {                  'none';
           } elsif ($env{'form.new_courserestricted'}) {
               $Apache::lonpublisher::metadatafields{'courserestricted'}=
                   $env{'form.new_courserestricted'}; 
           }           
           if (! $Apache::lonpublisher::metadatafields{'copyright'}) {
                 $Apache::lonpublisher::metadatafields{'copyright'}=                  $Apache::lonpublisher::metadatafields{'copyright'}=
                     'default';                  'default';
           }
           if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none') {
               $r->print(&mt('Associated with course [_1]','<strong>'.$env{$Apache::lonpublisher::metadatafields{'courserestricted'}.".description"}.
                           '</strong>').'<br />');
           } else {
               $r->print("This resource is not associated with a course.<br />");
           }
           foreach my $field_name (@fields) {
   
               if (defined($env{'form.new_'.$field_name})) {
                   $Apache::lonpublisher::metadatafields{$field_name}=
                       join(',',&Apache::loncommon::get_env_multiple('form.new_'.$field_name));
             }              }
             $r->print('<p>'.$lt{$_}.': '.              if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none') {
                       &prettyinput                  # handle restrictions here
                       ($_,$Apache::lonpublisher::metadatafields{$_},                  if (($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'} =~ m/active/) ||
                        'new_'.$_,'defaultmeta').'</p>');                      ($field_name eq 'courserestricted')){
         }                      $output.=("\n".'<p>'.$lt{$field_name}.': '.
         if ($ENV{'form.store'}) {                                &prettyinput($field_name,
             my $mfh;     $Apache::lonpublisher::metadatafields{$field_name},
             if (!  ($mfh=Apache::File->new('>'.$fn))) {                      'new_'.$field_name,'defaultmeta',
                 $r->print('<p><font color=red>'.                      undef,undef,undef,undef,
                           &mt('Could not write metadata').', '.                      $Apache::lonpublisher::metadatafields{'courserestricted'}).'</p>'."\n");
                           &mt('FAIL').'</font>');                   }
             } else {              } else {
                 foreach (sort keys %Apache::lonpublisher::metadatafields) {  
                     next if ($_ =~ /\./);                      $output.=('<p>'.$lt{$field_name}.': '.
                     my $unikey=$_;                              &prettyinput($field_name,
                     $unikey=~/^([A-Za-z]+)/;     $Apache::lonpublisher::metadatafields{$field_name},
                     my $tag=$1;     'new_'.$field_name,'defaultmeta').'</p>');
                     $tag=~tr/A-Z/a-z/;                 
                     print $mfh "\n\<$tag";  
                     foreach (split(/\,/,  
                                  $Apache::lonpublisher::metadatakeys{$unikey})  
                              ) {  
                         my $value=  
                          $Apache::lonpublisher::metadatafields{$unikey.'.'.$_};  
                         $value=~s/\"/\'\'/g;  
                         print $mfh ' '.$_.'="'.$value.'"';  
                     }  
                     print $mfh '>'.  
                         &HTML::Entities::encode  
                         ($Apache::lonpublisher::metadatafields{$unikey},  
                          '<>&"').  
                          '</'.$tag.'>';  
                 }  
                 $r->print('<p>'.&mt('Wrote Metadata'));  
             }              }
         }          }
         $r->print('<br /><input type="submit" name="store" value="'.   if ($env{'form.store'}) {
       my $mfh;
       my $formname='store'; 
       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.'>';
       }
       &Apache::lonnet::logthis(" file ".$file_content);
       if ($fn =~ m|/portfolio/|) {
    my ($path, $new_fn) = ($fn =~ m|/(portfolio.*)/([^/]*)$|);
    $env{'form.'.$formname}=$file_content."\n";
    $env{'form.'.$formname.'.filename'}=$new_fn;
    my $result =&Apache::lonnet::userfileupload($formname,'',
       $path);
   
    if ($result =~ /(error|notfound)/) {
       $r->print('<p><font color="red">'.
         &mt('Could not write metadata').', '.
         &mt('FAIL').'</font></p>');
    } else {
       $r->print('<p><font color="blue">'.&mt('Wrote Metadata').
         ' '.&Apache::lonlocal::locallocaltime(time).
         '</font></p>');
    }
       } 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="'.
                   &mt('Store Catalog Information').'">');                    &mt('Store Catalog Information').'">');
           
     }      }
     $r->print('</form>');      $r->print('</form>');
   
     return;      return;
 }  }
   
 1;  1;
 __END__  __END__
   
        

Removed from v.1.78  
changed lines
  Added in v.1.145


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.