--- loncom/interface/lonmeta.pm 2005/11/22 23:20:40 1.133 +++ loncom/interface/lonmeta.pm 2006/07/19 15:31:05 1.160 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Metadata display handler # -# $Id: lonmeta.pm,v 1.133 2005/11/22 23:20:40 banghart Exp $ +# $Id: lonmeta.pm,v 1.160 2006/07/19 15:31:05 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,6 +39,8 @@ use Apache::lonpublisher; use Apache::lonlocal; use Apache::lonmysql; use Apache::lonmsg; +use lib '/home/httpd/lib/perl/'; +use LONCAPA; ############################################################ @@ -71,20 +73,7 @@ sub get_dynamic_metadata_from_sql { 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 $query = 'SELECT * FROM metadata WHERE url LIKE "'.$url.'%"'; my $server = &Apache::lonnet::homeserver($author,$authordom); my $reply = &Apache::lonnet::metadata_query($query,undef,undef, ,[$server]); @@ -106,13 +95,9 @@ sub get_dynamic_metadata_from_sql { 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]; + my %hash=&LONCAPA::lonmetadata::metadata_col_to_hash(map { &unescape($_) } split(/\,/,$result)); + foreach my $key (keys(%hash)) { + $ReturnHash{$hash{'url'}}->{$key}=$hash{$key}; } } $finished = 1; @@ -248,8 +233,13 @@ sub fieldnames { 'notes' => 'Notes', 'abstract' => 'Abstract', 'lowestgradelevel' => 'Lowest Grade Level', - 'highestgradelevel' => 'Highest Grade Level', - 'courserestricted' => 'Course Restricting Metadata'); + 'highestgradelevel' => 'Highest Grade Level'); + + if (! defined($file_type) || $file_type ne 'portfolio') { + %fields = + (%fields, + 'courserestricted' => 'Course Restricting Metadata'); + } if (! defined($file_type) || $file_type ne 'portfolio') { %fields = @@ -290,42 +280,125 @@ sub fieldnames { return &Apache::lonlocal::texthash(%fields); } +sub portfolio_linked_path { + my ($path,$group,$port_path) = @_; + + my $start = 'portfolio'; + if ($group) { + $start = "groups/$group/".$start; + } + my $result = &Apache::portfolio::make_anchor($port_path,$start,'/'); + + my $fullpath = '/'; + my (undef,@tree) = split('/',$path); + my $filename = pop(@tree); + foreach my $dir (@tree) { + $fullpath .= $dir.'/'; + $result .= '/'; + $result .= &Apache::portfolio::make_anchor($port_path,$dir,$fullpath); + } + $result .= "/$filename"; + return $result; +} + +sub get_port_path_and_group { + my ($uri)=@_; + + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + + my ($port_path,$group); + if ($uri =~ m{^/editupload/\Q$cdom\E/\Q$cnum\E/groups/}) { + $group = (split('/',$uri))[5]; + $port_path = '/adm/coursegrp_portfolio'; + } else { + $port_path = '/adm/portfolio'; + } + if ($env{'form.group'} ne $group) { + $env{'form.group'} = $group) { + } + return ($port_path,$group); +} + +sub portfolio_display_uri { + my ($uri,$as_links)=@_; + + my ($port_path,$group) = &get_port_path_and_group($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|^portfolio(.*/)[^/]*$|); + if ($as_links) { + $res_uri = &portfolio_linked_path($res_uri,$group,$port_path); + $meta_uri = &portfolio_linked_path($meta_uri,$group,$port_path); + } + 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>'); + + my ($port_path,$group) = &get_port_path_and_group($uri); + $r->print('<br /><br /><form method="POST" action="'.$port_path.'">'. + '<input type="hidden" name="currentpath" value="'.$path.'" />'. + '<input type="hidden" name="group" value="'.$group.'" />'. + '<input type="submit" name="cancel" value="'.&mt('Cancel').'">'. + '</form>'); + + return; +} sub select_course { - my ($r)=@_; + my $output=$/; + my $current_restriction= + $Apache::lonpublisher::metadatafields{'courserestricted'}; + my $selected = ($current_restriction eq 'none' ? 'selected="selected"' + : ''); + + $output .= '<select name="new_courserestricted" >'; + $output .= '<option value="none" '.$selected.'>'. + &mt('None').'</option>'.$/; my %courses; - 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; - } - } - $r->print('<h3>Course Related Meta-Data</h3><br />'); - $r->print('<form action="" method="post">'); - $r->print('Select course restrictions<br />'); - $r->print('<select name="metacourse" >'); - my $meta_not_found = 1; - foreach my $key (keys (%courses)) { - if ($meta_not_found) { - undef($meta_not_found); - $r->print('<h3>Portfolio Meta-Data</h3><br />'); - $r->print('<form action="" method="post">'); - $r->print('Select your course<br />'); - $r->print('<select name="metacourse" >'); - } - $key =~ m/(^.+)\.description$/; - $r->print('<option value="'.$1.'">'); - $r->print($courses{$key}); - $r->print('</option>'); - } - unless ($meta_not_found) { - $r->print('</select><br />'); - $r->print('<input type="submit" value="Assign Portfolio Metadata" />'); - $r->print('</form>'); + foreach my $key (keys(%env)) { + if ($key !~ m/^course\.(.+)\.description$/) { next; } + my $cid = $1; + if ($env{$key} !~ /\S/) { next; } + $courses{$key} = $cid; + } + foreach my $key (sort { lc($env{$a}) cmp lc($env{$b}) } (keys(%courses))) { + my $cid = 'course.'.$courses{$key}; + my $selected = ($current_restriction eq $cid ? 'selected="selected"' + : ''); + if ($env{$key} !~ /\S/) { next; } + $output .= '<option value="'.$cid.'" '.$selected.'>'; + $output .= $env{$key}; + $output .= '</option>'.$/; + $selected = ''; } - return 'ok'; + $output .= '</select><br />'; + return ($output); } # Pretty printing of metadata field @@ -387,7 +460,7 @@ sub prettyprint { ($type eq 'comefrom_list') || ($type eq 'sequsage_list') || ($type eq 'dependencies')) { - return '<ul><font size="-1">'.join("\n",map { + return '<font size="-1"><ul>'.join("\n",map { my $url = &Apache::lonnet::clutter($_); my $title = &Apache::lonnet::gettitle($url); if ($title eq '') { @@ -424,18 +497,19 @@ sub prettyprint { # List of courses if ($type=~/\_list/) { my @Courses = split(/\s*\,\s*/,$value); - my $Str; + my $Str='<font size="-1"><ul>'; foreach my $course (@Courses) { - my %courseinfo = &Apache::lonnet::coursedescription($course); + my %courseinfo = + &Apache::lonnet::coursedescription($course, + {'one_time' => 1}); if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') { next; } - if ($Str ne '') { $Str .= '<br />'; } - $Str .= '<a href="/public/'.$courseinfo{'domain'}.'/'. + $Str .= '<li><a href="/public/'.$courseinfo{'domain'}.'/'. $courseinfo{'num'}.'/syllabus" target="preview">'. - $courseinfo{'description'}.'</a>'; + $courseinfo{'description'}.'</a></li>'; } - return $Str; + return $Str.'</ul></font>'; } # No pretty print found return $value; @@ -484,7 +558,8 @@ sub prettyinput { $size = 80; } my $output; - if (defined($course_key)) { + if (defined($course_key) + && exists($env{$course_key.'.metadata.'.$type.'.options'})) { my $stu_add; my $only_one; my %meta_options; @@ -516,14 +591,15 @@ sub prettyinput { $cur_values_stu = $value; } if ($type eq 'courserestricted') { - return ('<input type="hidden" name="new_courserestricted" value="'.$course_key.'" />'); + 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($value,'new_'.$type,%meta_options)); + $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)); } @@ -603,6 +679,11 @@ sub prettyinput { ",'rights')\">".&mt('Select').'</a>'. &relatedfield(0,$relatedsearchflag,$relatedsep); } + if ($type eq 'courserestricted') { + return (&select_course()); + #return ('<input type="hidden" name="new_courserestricted" value="'.$course_key.'" />'); + } + # Dates if (($type eq 'creationdate') || ($type eq 'lastrevisiondate')) { @@ -635,32 +716,35 @@ sub handler { # my ($resdomain,$resuser)= (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//); - my $html=&Apache::lonxml::xmlbegin(); - $r->print($html.'<head><title>'. - 'Catalog Information'. - '</title></head>'); + if ($uri=~m:/adm/bombs/(.*)$:) { - $r->print(&Apache::loncommon::bodytag('Error Messages')); + $r->print(&Apache::loncommon::start_page('Error Messages')); # Looking for all bombs? &report_bombs($r,$uri); } elsif ($uri=~/\/portfolio\//) { - ($resdomain,$resuser)= + ($resdomain,$resuser)= (&Apache::lonnet::declutter($uri)=~m|^(\w+)/(\w+)/portfolio|); - $r->print(&Apache::loncommon::bodytag - ('Edit Portfolio File Information','','','',$resdomain)); - &present_editable_metadata($r,$uri,'portfolio'); - &select_course($r); + $r->print(&Apache::loncommon::start_page('Edit Portfolio File Catalog Information', + undef, + {'domain' => $resdomain,})); + if ($env{'form.store'}) { + &present_editable_metadata($r,$uri,'portfolio'); + } else { + &pre_select_course($r,$uri); + } } elsif ($uri=~/^\/\~/) { # Construction space - $r->print(&Apache::loncommon::bodytag - ('Edit Catalog Information','','','',$resdomain)); + $r->print(&Apache::loncommon::start_page('Edit Catalog nformation', + undef, + {'domain' => $resdomain,})); &present_editable_metadata($r,$uri); } else { - $r->print(&Apache::loncommon::bodytag - ('Catalog Information','','','',$resdomain)); + $r->print(&Apache::loncommon::start_page('Catalog Information', + undef, + {'domain' => $resdomain,})); &present_uneditable_metadata($r,$uri); } - $r->print('</body></html>'); + $r->print(&Apache::loncommon::end_page()); return OK; } @@ -724,6 +808,7 @@ sub present_uneditable_metadata { my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/); $uri=~s/\.meta$//; my $disuri=&Apache::lonnet::clutter($uri); + $disuri=~s/^\/adm\/wrapper//; # version my $currentversion=&Apache::lonnet::getversion($disuri); my $versiondisplay=''; @@ -874,7 +959,9 @@ sub print_dynamic_metadata { foreach my $identifier (sort(keys(%{$dynmeta{'stats'}}))) { my $data = $dynmeta{'stats'}->{$identifier}; my $course = $data->{'course'}; - my %courseinfo = &Apache::lonnet::coursedescription($course); + my %courseinfo = + &Apache::lonnet::coursedescription($course, + {'one_time' => 1}); if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') { &Apache::lonnet::logthis('lookup for '.$course.' failed'); next; @@ -999,11 +1086,15 @@ sub present_editable_metadata { # Header my $disuri=$uri; my $fn=&Apache::lonnet::filelocation('',$uri); - $disuri=~s/^\/\~/\/priv\//; + $disuri=~s{^/\~}{/priv/}; $disuri=~s/\.meta$//; - $disuri=~s|^/editupload||; + my $meta_uri = $disuri; + my $path; + if ($disuri =~ m|/portfolio/|) { + ($disuri, $meta_uri, $path) = &portfolio_display_uri($disuri,1); + } my $target=$uri; - $target=~s/^\/\~/\/res\/$env{'request.role.domain'}\//; + $target=~s{^/\~}{/res/$env{'request.role.domain'}/}; $target=~s/\.meta$//; my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target); if ($bombs) { @@ -1055,7 +1146,7 @@ ENDDEL %Apache::lonpublisher::metadatakeys=(); my $result=&Apache::lonnet::getfile($fn); if ($result == -1){ - $r->print('Creating new '.$disuri); + $r->print(&mt('Creating new file [_1]'),$meta_uri); } else { &Apache::lonpublisher::metaeval($result); } @@ -1071,7 +1162,7 @@ ENDEDIT my @fields; if ($file_type eq 'portfolio') { @fields = ('author','title','subject','keywords','abstract','notes','lowestgradelevel', - 'highestgradelevel','standards','courserestricted'); + 'highestgradelevel','standards'); } else { @fields = ('author','title','subject','keywords','abstract','notes', 'copyright','customdistributionfile','language', @@ -1079,127 +1170,141 @@ ENDEDIT 'lowestgradelevel','highestgradelevel','sourceavail','sourcerights', 'obsolete','obsoletereplacement'); } - my $metacourse; - if ($env{'form.metacourse'} ) { - $Apache::lonpublisher::metadatafields{'courserestricted'} = $env{'form.metacourse'}; - $metacourse = $env{'form.metacourse'}; - } else { - if (! $Apache::lonpublisher::metadatafields{'courserestricted'}) { - $Apache::lonpublisher::metadatafields{'courserestricted'}= - 'none'; - $metacourse = 'none'; - } else { - $metacourse = $Apache::lonpublisher::metadatafields{'courserestricted'}; - } - } + if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) && + (! $env{'form.new_courserestricted'})) { + $Apache::lonpublisher::metadatafields{'courserestricted'}= + 'none'; + } elsif ($env{'form.new_courserestricted'}) { + $Apache::lonpublisher::metadatafields{'courserestricted'}= + $env{'form.new_courserestricted'}; + } if (! $Apache::lonpublisher::metadatafields{'copyright'}) { $Apache::lonpublisher::metadatafields{'copyright'}= 'default'; } - if ($metacourse ne 'none') { - $r->print('Document metadata restricted by :<strong> '.$env{$metacourse.".description"}."</strong><br />"); - } - foreach my $field_name(@fields) { + if ($file_type eq 'portfolio') { + 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)); } - if ($metacourse ne 'none') { + if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none' + && exists($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'})) { # handle restrictions here - if ($env{$metacourse.'.metadata.'.$field_name.'.options'} =~ m/active/){ - $output.=('<p>'.$lt{$field_name}.': '. + if (($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'} =~ m/active/) || + ($field_name eq 'courserestricted')){ + $output.=("\n".'<p>'.$lt{$field_name}.': '. &prettyinput($field_name, $Apache::lonpublisher::metadatafields{$field_name}, - 'new_'.$field_name,'defaultmeta',undef,undef,undef,undef,$metacourse).'</p>'); - } elsif ($field_name eq 'courserestricted') { - $output.=( - &prettyinput($field_name, - $Apache::lonpublisher::metadatafields{$field_name}, - 'new_'.$field_name,'defaultmeta',undef,undef,undef,undef,$metacourse)); + 'new_'.$field_name,'defaultmeta', + undef,undef,undef,undef, + $Apache::lonpublisher::metadatafields{'courserestricted'}).'</p>'."\n"); } } else { - if ($field_name ne 'courserestricted') { + $output.=('<p>'.$lt{$field_name}.': '. &prettyinput($field_name, $Apache::lonpublisher::metadatafields{$field_name}, 'new_'.$field_name,'defaultmeta').'</p>'); - } else { - $output.=&prettyinput($field_name, - $Apache::lonpublisher::metadatafields{$field_name}, - 'new_'.$field_name,'defaultmeta'); - } + } } - if ($env{'form.store'}) { - my $mfh; - my $formname='store'; - my $file_content; - foreach my $meta_field (keys %env) { - 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 =~ /\/portfolio\//) { - $fn =~ /\/portfolio\/(.*)$/; - my $new_fn = '/'.$1; - $env{'form.'.$formname}=$file_content; - $env{'form.'.$formname.'.filename'}=$new_fn; - &Apache::lonnet::userfileupload('uploaddoc','', - 'portfolio'.$env{'form.currentpath'}); - if (&Apache::lonnet::userfileupload($formname,'','portfolio') eq 'error: no uploaded file') { - $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; + 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.'>'; + } + 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="'. &mt('Store Catalog Information').'">'); + + if ($file_type eq 'portfolio') { + my ($port_path,$group) = &get_port_path_and_group($uri); + if ($group) { + $r->print('<input type="hidden" name="group" value="'.$group.'" />'); + } + $r->print('</form> + <br /><br /><form method="POST" action="'.$port_path.'">'. + '<input type="hidden" name="group" value="'.$group.'" />'. + '<input type="hidden" name="currentpath" value="'.$path.'" />'. + '<input type="submit" name="cancel" value="'.&mt('Discard Edits and Return to Portfolio').'">'); + } } + $r->print('</form>'); + return; } +sub store_portfolio_metadata { + my ($formname,$content,$path,$new_fn) = @_; + $env{'form.'.$formname}=$content."\n"; + $env{'form.'.$formname.'.filename'}=$new_fn; + my $result =&Apache::lonnet::userfileupload($formname,'',$path); + if ($result =~ /(error|notfound)/) { + return '<p><font color="red">'. + &mt('Could not write metadata').', '. + &mt('FAIL').'</font></p>'; + } else { + return '<p><font color="blue">'.&mt('Wrote Metadata'). + ' '.&Apache::lonlocal::locallocaltime(time).'</font></p>'; + } +} + 1; __END__ -