Annotation of loncom/interface/lonmeta.pm, revision 1.233

1.1       www         1: # The LearningOnline Network with CAPA
1.8       albertel    2: # Metadata display handler
                      3: #
1.233   ! bisitz      4: # $Id: lonmeta.pm,v 1.232 2009/04/29 15:20:54 bisitz Exp $
1.8       albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
1.1       www        14: #
1.8       albertel   15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
1.100     banghart   20: # You should have received a copy of the GNU General Public License 
1.8       albertel   21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
1.44      www        27: 
1.1       www        28: 
                     29: package Apache::lonmeta;
                     30: 
                     31: use strict;
1.63      matthew    32: use LONCAPA::lonmetadata();
1.1       www        33: use Apache::Constants qw(:common);
1.96      albertel   34: use Apache::lonnet;
1.10      www        35: use Apache::loncommon();
1.100     banghart   36: use Apache::lonhtmlcommon(); 
1.23      www        37: use Apache::lonmsg;
                     38: use Apache::lonpublisher;
1.35      www        39: use Apache::lonlocal;
1.43      www        40: use Apache::lonmysql;
1.49      www        41: use Apache::lonmsg;
1.190     albertel   42: use LONCAPA qw(:DEFAULT :match);
1.1       www        43: 
1.44      www        44: 
1.80      matthew    45: sub get_dynamic_metadata_from_sql {
                     46:     my ($url) = shift();
1.190     albertel   47:     my ($authordom,$author)=($url=~m{^/res/($match_domain)/($match_username)/});
1.80      matthew    48:     if (! defined($authordom)) {
                     49:         $authordom = shift();
                     50:     }
                     51:     if  (! defined($author)) { 
                     52:         $author = shift();
                     53:     }
                     54:     if (! defined($authordom) || ! defined($author)) {
                     55:         return ();
                     56:     }
1.158     www        57:     my $query = 'SELECT * FROM metadata WHERE url LIKE "'.$url.'%"';
1.80      matthew    58:     my $server = &Apache::lonnet::homeserver($author,$authordom);
                     59:     my $reply = &Apache::lonnet::metadata_query($query,undef,undef,
                     60:                                                 ,[$server]);
                     61:     return () if (! defined($reply) || ref($reply) ne 'HASH');
                     62:     my $filename = $reply->{$server};
                     63:     if (! defined($filename) || $filename =~ /^error/) {
                     64:         return ();
                     65:     }
                     66:     my $max_time = time + 10; # wait 10 seconds for results at most
                     67:     my %ReturnHash;
                     68:     #
                     69:     # Look for results
                     70:     my $finished = 0;
                     71:     while (! $finished && time < $max_time) {
                     72:         my $datafile=$Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/'.$filename;
                     73:         if (! -e "$datafile.end") { next; }
                     74:         my $fh;
                     75:         if (!($fh=Apache::File->new($datafile))) { next; }
                     76:         while (my $result = <$fh>) {
                     77:             chomp($result);
                     78:             next if (! $result);
1.180     albertel   79:             my %hash=&LONCAPA::lonmetadata::metadata_col_to_hash('metadata',
                     80: 								 map { &unescape($_) } split(/\,/,$result));
1.158     www        81:             foreach my $key (keys(%hash)) {
                     82:                 $ReturnHash{$hash{'url'}}->{$key}=$hash{$key};
1.80      matthew    83:             }
                     84:         }
                     85:         $finished = 1;
                     86:     }
                     87:     #
                     88:     return %ReturnHash;
                     89: }
                     90: 
                     91: 
1.64      matthew    92: # Fetch and evaluate dynamic metadata
1.9       www        93: sub dynamicmeta {
                     94:     my $url=&Apache::lonnet::declutter(shift);
                     95:     $url=~s/\.meta$//;
1.190     albertel   96:     my ($adomain,$aauthor)=($url=~/^($match_domain)\/($match_username)\//);
1.19      www        97:     my $regexp=$url;
1.9       www        98:     $regexp=~s/(\W)/\\$1/g;
1.10      www        99:     $regexp='___'.$regexp.'___';
1.16      albertel  100:     my %evaldata=&Apache::lonnet::dump('nohist_resevaldata',$adomain,
                    101: 				       $aauthor,$regexp);
1.63      matthew   102:     my %DynamicData = &LONCAPA::lonmetadata::process_reseval_data(\%evaldata);
                    103:     my %Data = &LONCAPA::lonmetadata::process_dynamic_metadata($url,
                    104:                                                                \%DynamicData);
1.40      matthew   105:     #
1.46      www       106:     # Deal with 'count' separately
1.63      matthew   107:     $Data{'count'} = &access_count($url,$aauthor,$adomain);
1.67      matthew   108:     #
                    109:     # Debugging code I will probably need later
                    110:     if (0) {
                    111:         &Apache::lonnet::logthis('Dynamic Metadata');
                    112:         while(my($k,$v)=each(%Data)){
                    113:             &Apache::lonnet::logthis('    "'.$k.'"=>"'.$v.'"');
                    114:         }
                    115:         &Apache::lonnet::logthis('-------------------');
                    116:     }
1.63      matthew   117:     return %Data;
1.40      matthew   118: }
                    119: 
                    120: sub access_count {
                    121:     my ($src,$author,$adomain) = @_;
                    122:     my %countdata=&Apache::lonnet::dump('nohist_accesscount',$adomain,
                    123:                                         $author,$src);
                    124:     if (! exists($countdata{$src})) {
1.47      www       125:         return &mt('Not Available');
1.40      matthew   126:     } else {
                    127:         return $countdata{$src};
                    128:     }
1.25      www       129: }
                    130: 
1.64      matthew   131: # Try to make an alt tag if there is none
1.25      www       132: sub alttag {
1.26      www       133:     my ($base,$src)=@_;
                    134:     my $fullpath=&Apache::lonnet::hreflocation($base,$src);
                    135:     my $alttag=&Apache::lonnet::metadata($fullpath,'title').' '.
1.64      matthew   136:         &Apache::lonnet::metadata($fullpath,'subject').' '.
                    137:         &Apache::lonnet::metadata($fullpath,'abstract');
1.26      www       138:     $alttag=~s/\s+/ /gs;
                    139:     $alttag=~s/\"//gs;
                    140:     $alttag=~s/\'//gs;
                    141:     $alttag=~s/\s+$//gs;
                    142:     $alttag=~s/^\s+//gs;
1.64      matthew   143:     if ($alttag) { 
                    144:         return $alttag; 
                    145:     } else { 
                    146:         return &mt('No information available'); 
                    147:     }
1.9       www       148: }
1.1       www       149: 
1.64      matthew   150: # Author display
1.29      www       151: sub authordisplay {
                    152:     my ($aname,$adom)=@_;
1.64      matthew   153:     return &Apache::loncommon::aboutmewrapper
                    154:         (&Apache::loncommon::plainname($aname,$adom),
1.164     albertel  155:          $aname,$adom,'preview').' <tt>['.$aname.':'.$adom.']</tt>';
1.29      www       156: }
                    157: 
1.64      matthew   158: # Pretty display
1.12      www       159: sub evalgraph {
                    160:     my $value=shift;
1.65      matthew   161:     if (! $value) { 
                    162:         return '';
                    163:     }
1.12      www       164:     my $val=int($value*10.+0.5)-10;
1.71      matthew   165:     my $output='<table border="0" cellpadding="0" cellspacing="0"><tr>';
1.12      www       166:     if ($val>=20) {
1.221     raeburn   167: 	$output.='<td width="20" bgcolor="#555555">'.('&nbsp;' x2).'</td>';
1.12      www       168:     } else {
1.71      matthew   169:         $output.='<td width="'.($val).'" bgcolor="#555555">&nbsp;</td>'.
                    170:                  '<td width="'.(20-$val).'" bgcolor="#FF3333">&nbsp;</td>';
1.12      www       171:     }
                    172:     $output.='<td bgcolor="#FFFF33">&nbsp;</td>';
                    173:     if ($val>20) {
1.71      matthew   174: 	$output.='<td width="'.($val-20).'" bgcolor="#33FF33">&nbsp;</td>'.
                    175:                  '<td width="'.(40-$val).'" bgcolor="#555555">&nbsp;</td>';
1.12      www       176:     } else {
1.221     raeburn   177:         $output.='<td width="20" bgcolor="#555555">'.('&nbsp;' x2).'</td>';
1.12      www       178:     }
1.71      matthew   179:     $output.='<td> ('.sprintf("%5.2f",$value).') </td></tr></table>';
1.12      www       180:     return $output;
                    181: }
                    182: 
                    183: sub diffgraph {
                    184:     my $value=shift;
1.65      matthew   185:     if (! $value) { 
                    186:         return '';
                    187:     }
1.12      www       188:     my $val=int(40.0*$value+0.5);
1.13      www       189:     my @colors=('#FF9933','#EEAA33','#DDBB33','#CCCC33',
                    190:                 '#BBDD33','#CCCC33','#DDBB33','#EEAA33');
1.71      matthew   191:     my $output='<table border="0" cellpadding="0" cellspacing="0"><tr>';
1.12      www       192:     for (my $i=0;$i<8;$i++) {
                    193: 	if ($val>$i*5) {
1.71      matthew   194:             $output.='<td width="5" bgcolor="'.$colors[$i].'">&nbsp;</td>';
1.12      www       195:         } else {
1.71      matthew   196: 	    $output.='<td width="5" bgcolor="#555555">&nbsp;</td>';
1.12      www       197: 	}
                    198:     }
1.71      matthew   199:     $output.='<td> ('.sprintf("%3.2f",$value).') </td></tr></table>';
1.12      www       200:     return $output;
                    201: }
                    202: 
1.44      www       203: 
1.64      matthew   204: # The field names
1.45      www       205: sub fieldnames {
1.90      banghart  206:     my $file_type=shift;
1.115     banghart  207:     my %fields = 
                    208:         ('title' => 'Title',
1.113     banghart  209:          'author' =>'Author(s)',
1.131     albertel  210:          'authorspace' => 'Author Space',
                    211:          'modifyinguser' => 'Last Modifying User',
1.113     banghart  212:          'subject' => 'Subject',
1.133     banghart  213:          'standards' => 'Standards',
1.113     banghart  214:          'keywords' => 'Keyword(s)',
                    215:          'notes' => 'Notes',
                    216:          'abstract' => 'Abstract',
                    217:          'lowestgradelevel' => 'Lowest Grade Level',
1.149     albertel  218:          'highestgradelevel' => 'Highest Grade Level');
                    219:     
1.191     raeburn   220:     if ( !defined($file_type) || ($file_type ne 'portfolio' && $file_type ne 'groups') ) {
1.149     albertel  221:         %fields = 
1.93      matthew   222:         (%fields,
                    223:          'domain' => 'Domain',
1.64      matthew   224:          'mime' => 'MIME Type',
                    225:          'language' => 'Language',
                    226:          'creationdate' => 'Creation Date',
                    227:          'lastrevisiondate' => 'Last Revision Date',
                    228:          'owner' => 'Publisher/Owner',
                    229:          'copyright' => 'Copyright/Distribution',
                    230:          'customdistributionfile' => 'Custom Distribution File',
1.84      banghart  231:          'sourceavail' => 'Source Available',
1.78      taceyjo1  232:          'sourcerights' => 'Source Custom Distribution File',
1.64      matthew   233:          'obsolete' => 'Obsolete',
                    234:          'obsoletereplacement' => 'Suggested Replacement for Obsolete File',
                    235:          'count'      => 'Network-wide number of accesses (hits)',
                    236:          'course'     => 'Network-wide number of courses using resource',
                    237:          'course_list' => 'Network-wide courses using resource',
                    238:          'sequsage'      => 'Number of resources using or importing resource',
                    239:          'sequsage_list' => 'Resources using or importing resource',
                    240:          'goto'       => 'Number of resources that follow this resource in maps',
                    241:          'goto_list'  => 'Resources that follow this resource in maps',
                    242:          'comefrom'   => 'Number of resources that lead up to this resource in maps',
                    243:          'comefrom_list' => 'Resources that lead up to this resource in maps',
                    244:          'clear'      => 'Material presented in clear way',
                    245:          'depth'      => 'Material covered with sufficient depth',
                    246:          'helpful'    => 'Material is helpful',
                    247:          'correct'    => 'Material appears to be correct',
                    248:          'technical'  => 'Resource is technically correct', 
                    249:          'avetries'   => 'Average number of tries till solved',
1.205     www       250:          'stdno'      => 'Statistics calculated for number of students',
1.73      matthew   251:          'difficulty' => 'Degree of difficulty',
                    252:          'disc'       => 'Degree of discrimination',
1.133     banghart  253: 	     'dependencies' => 'Resources used by this resource',
1.64      matthew   254:          );
1.93      matthew   255:     }
                    256:     return &Apache::lonlocal::texthash(%fields);
1.45      www       257: }
1.141     albertel  258: 
1.146     albertel  259: sub portfolio_linked_path {
1.155     albertel  260:     my ($path,$group,$port_path) = @_;
                    261: 
                    262:     my $start = 'portfolio';
                    263:     if ($group) {
                    264: 	$start = "groups/$group/".$start;
                    265:     }
1.166     banghart  266:     my %anchor_fields = (
1.165     banghart  267:         'selectfile'  => $start,
                    268:         'currentpath' => '/'
                    269:     );
                    270:     my $result = &Apache::portfolio::make_anchor($port_path,\%anchor_fields,$start);
1.146     albertel  271:     my $fullpath = '/';
                    272:     my (undef,@tree) = split('/',$path);
1.147     albertel  273:     my $filename = pop(@tree);
1.146     albertel  274:     foreach my $dir (@tree) {
                    275: 	$fullpath .= $dir.'/';
                    276: 	$result .= '/';
1.166     banghart  277: 	my %anchor_fields = (
1.165     banghart  278:             'selectfile'  => $dir,
                    279:             'currentpath' => $fullpath
                    280:         );
                    281: 	$result .= &Apache::portfolio::make_anchor($port_path,\%anchor_fields,$dir);
1.146     albertel  282:     }
1.147     albertel  283:     $result .= "/$filename";
1.146     albertel  284:     return $result;
                    285: }
                    286: 
1.156     albertel  287: sub get_port_path_and_group {
                    288:     my ($uri)=@_;
                    289: 
1.155     albertel  290:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    291:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
1.156     albertel  292: 
1.155     albertel  293:     my ($port_path,$group);
                    294:     if ($uri =~ m{^/editupload/\Q$cdom\E/\Q$cnum\E/groups/}) {
                    295: 	$group = (split('/',$uri))[5];
                    296: 	$port_path = '/adm/coursegrp_portfolio';
                    297:     } else {
                    298: 	$port_path = '/adm/portfolio';
                    299:     }
1.160     albertel  300:     if ($env{'form.group'} ne $group) {
1.161     albertel  301: 	$env{'form.group'} = $group;
1.160     albertel  302:     }
1.156     albertel  303:     return ($port_path,$group);
                    304: }
                    305: 
                    306: sub portfolio_display_uri {
                    307:     my ($uri,$as_links)=@_;
                    308: 
                    309:     my ($port_path,$group) = &get_port_path_and_group($uri);
                    310: 
1.144     albertel  311:     $uri =~ s|.*/(portfolio/.*)$|$1|;
1.141     albertel  312:     my ($res_uri,$meta_uri) = ($uri,$uri);
                    313:     if ($uri =~ /\.meta$/) {
                    314: 	$res_uri =~ s/\.meta//;
                    315:     } else {
                    316: 	$meta_uri .= '.meta';
                    317:     }
1.146     albertel  318: 
1.148     albertel  319:     my ($path) = ($res_uri =~ m|^portfolio(.*/)[^/]*$|);
1.146     albertel  320:     if ($as_links) {
1.155     albertel  321: 	$res_uri = &portfolio_linked_path($res_uri,$group,$port_path);
                    322: 	$meta_uri = &portfolio_linked_path($meta_uri,$group,$port_path);
1.146     albertel  323:     }
1.145     albertel  324:     return ($res_uri,$meta_uri,$path);
1.141     albertel  325: }
                    326: 
1.140     banghart  327: sub pre_select_course {
                    328:     my ($r,$uri) = @_;
                    329:     my $output;
                    330:     my $fn=&Apache::lonnet::filelocation('',$uri);
1.145     albertel  331:     my ($res_uri,$meta_uri,$path) = &portfolio_display_uri($uri);
1.140     banghart  332:     %Apache::lonpublisher::metadatafields=();
                    333:     %Apache::lonpublisher::metadatakeys=();
                    334:     my $result=&Apache::lonnet::getfile($fn);
                    335:     if ($result == -1){
1.141     albertel  336:         $r->print(&mt('Creating new file [_1]'),$meta_uri);
1.140     banghart  337:     } else {
                    338:         &Apache::lonpublisher::metaeval($result);
                    339:     }
1.141     albertel  340:     $r->print('<hr /><form method="post" action="" >');
1.224     bisitz    341:     $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>');
1.140     banghart  342:     $output = &select_course();
                    343:     $r->print($output.'<br /><input type="submit" name="store" value="'.
1.167     banghart  344:                   &mt('Associate Resource With Selected Course').'" />');
1.169     banghart  345:     $r->print('<input type="hidden" name="currentpath" value="'.$env{'form.currentpath'}.'" />');
                    346:     $r->print('<input type="hidden" name="associate" value="true" />');
1.140     banghart  347:     $r->print('</form>');
1.145     albertel  348:     
1.156     albertel  349:     my ($port_path,$group) = &get_port_path_and_group($uri);
1.167     banghart  350:     my $group_input;
                    351:     if ($group) {
1.168     banghart  352:         $group_input = '<input type="hidden" name="group" value="'.$group.'" />';
                    353:     } 
1.167     banghart  354:     $r->print('<br /><br /><form method="post" action="'.$port_path.'">'.
1.145     albertel  355:               '<input type="hidden" name="currentpath" value="'.$path.'" />'.
1.167     banghart  356: 	      $group_input.
                    357: 	      '<input type="submit" name="cancel" value="'.&mt('Cancel').'" />'.
1.145     albertel  358: 	      '</form>');
                    359: 
1.140     banghart  360:     return;
                    361: }
1.100     banghart  362: sub select_course {
1.150     albertel  363:     my $output=$/;
                    364:     my $current_restriction=
                    365: 	$Apache::lonpublisher::metadatafields{'courserestricted'};
                    366:     my $selected = ($current_restriction eq 'none' ? 'selected="selected"' 
                    367: 		                                   : '');
1.200     raeburn   368:     if ($current_restriction =~ /^course\.($match_domain\_$match_courseid)$/) {
                    369:         my $assoc_crs = $1;
                    370:         my $added_metadata_fields = &Apache::lonparmset::get_added_meta_fieldnames($assoc_crs);
                    371:         if (ref($added_metadata_fields) eq 'HASH') {
                    372:             if (keys(%{$added_metadata_fields}) > 0) {
                    373:                 my $transfernotes;
                    374:                 foreach my $field_name (keys(%{$added_metadata_fields})) {
                    375:                     my $value = $Apache::lonpublisher::metadatafields{$field_name};
                    376:                     if ($value) {
                    377:                         $transfernotes .= 
                    378:                             &Apache::loncommon::start_data_table_row(). 
                    379:                             '<td><input type="checkbox" name="transfer_'.
                    380:                             $field_name.'" value="1" /></td><td>'.
                    381:                             $field_name.'</td><td>'.$value.'</td>'.
                    382:                             &Apache::loncommon::end_data_table_row();
                    383:                     }
                    384:                 }
                    385:                 if ($transfernotes ne '') {
                    386:                     my %courseinfo = &Apache::lonnet::coursedescription($assoc_crs,{'one_time' => 1});
                    387:                     my $assoc_crs_description = $courseinfo{'description'};
                    388:                     $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".
                    389:                     &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 />'.
                    390:                     &Apache::loncommon::start_data_table().
                    391:                     &Apache::loncommon::start_data_table_header_row().
                    392:                     '<th>Copy to notes?</th>'."\n".
                    393:                     '<th>Field name</th>'."\n".
                    394:                     '<th>Values</th>'."\n".
                    395:                     &Apache::loncommon::end_data_table_header_row().
                    396:                     $transfernotes.
                    397:                     &Apache::loncommon::end_data_table().'<br />';
                    398:                 }
                    399:             }
                    400:         }
                    401:     }
1.150     albertel  402:     $output .= '<select name="new_courserestricted" >';
                    403:     $output .= '<option value="none" '.$selected.'>'.
                    404: 	&mt('None').'</option>'.$/;
1.113     banghart  405:     my %courses;
1.150     albertel  406:     foreach my $key (keys(%env)) {
                    407:         if ($key !~ m/^course\.(.+)\.description$/) { next; }
                    408: 	my $cid = $1;
                    409:         if ($env{$key} !~ /\S/) { next; }
                    410: 	$courses{$key} = $cid;
                    411:     }
                    412:     foreach my $key (sort { lc($env{$a}) cmp lc($env{$b}) } (keys(%courses))) {
                    413: 	my $cid = 'course.'.$courses{$key};
                    414: 	my $selected = ($current_restriction eq $cid ? 'selected="selected"' 
                    415: 		                                     : '');
                    416:         if ($env{$key} !~ /\S/) { next; }
                    417: 	$output .= '<option value="'.$cid.'" '.$selected.'>';
                    418: 	$output .= $env{$key};
                    419: 	$output .= '</option>'.$/;
                    420: 	$selected = '';
1.100     banghart  421:     }
1.138     banghart  422:     $output .= '</select><br />';
1.137     banghart  423:     return ($output);
1.100     banghart  424: }
1.64      matthew   425: # Pretty printing of metadata field
1.46      www       426: 
                    427: sub prettyprint {
1.82      www       428:     my ($type,$value,$target,$prefix,$form,$noformat)=@_;
                    429: # $target,$prefix,$form are optional and for filecrumbs only
1.65      matthew   430:     if (! defined($value)) { 
                    431:         return '&nbsp;'; 
                    432:     }
1.64      matthew   433:     # Title
1.46      www       434:     if ($type eq 'title') {
1.226     schulted  435: 	return $value;
1.46      www       436:     }
1.64      matthew   437:     # Dates
1.46      www       438:     if (($type eq 'creationdate') ||
                    439: 	($type eq 'lastrevisiondate')) {
1.55      www       440: 	return ($value?&Apache::lonlocal::locallocaltime(
                    441: 			  &Apache::lonmysql::unsqltime($value)):
                    442: 		&mt('not available'));
1.46      www       443:     }
1.64      matthew   444:     # Language
1.46      www       445:     if ($type eq 'language') {
                    446: 	return &Apache::loncommon::languagedescription($value);
                    447:     }
1.64      matthew   448:     # Copyright
1.46      www       449:     if ($type eq 'copyright') {
                    450: 	return &Apache::loncommon::copyrightdescription($value);
                    451:     }
1.78      taceyjo1  452:     # Copyright
                    453:     if ($type eq 'sourceavail') {
                    454: 	return &Apache::loncommon::source_copyrightdescription($value);
                    455:     }
1.64      matthew   456:     # MIME
1.46      www       457:     if ($type eq 'mime') {
1.64      matthew   458:         return '<img src="'.&Apache::loncommon::icon($value).'" />&nbsp;'.
                    459:             &Apache::loncommon::filedescription($value);
                    460:     }
                    461:     # Person
1.46      www       462:     if (($type eq 'author') || 
                    463: 	($type eq 'owner') ||
                    464: 	($type eq 'modifyinguser') ||
                    465: 	($type eq 'authorspace')) {
1.190     albertel  466: 	$value=~s/($match_username)(\:|\@)($match_domain)/&authordisplay($1,$3)/gse;
1.46      www       467: 	return $value;
                    468:     }
1.64      matthew   469:     # Gradelevel
1.48      www       470:     if (($type eq 'lowestgradelevel') ||
                    471: 	($type eq 'highestgradelevel')) {
                    472: 	return &Apache::loncommon::gradeleveldescription($value);
                    473:     }
1.64      matthew   474:     # Only for advance users below
1.96      albertel  475:     if (! $env{'user.adv'}) { 
1.65      matthew   476:         return '<i>- '.&mt('not displayed').' -</i>';
                    477:     }
1.64      matthew   478:     # File
1.46      www       479:     if (($type eq 'customdistributionfile') ||
                    480: 	($type eq 'obsoletereplacement') ||
                    481: 	($type eq 'goto_list') ||
                    482: 	($type eq 'comefrom_list') ||
1.82      www       483: 	($type eq 'sequsage_list') ||
1.83      www       484: 	($type eq 'dependencies')) {
1.226     schulted  485: 	return '<ul class="LC_fontsize_medium">'.join("\n",map {
1.183     albertel  486:             my $url = &Apache::lonnet::clutter_with_no_wrapper($_);
1.72      matthew   487:             my $title = &Apache::lonnet::gettitle($url);
                    488:             if ($title eq '') {
                    489:                 $title = 'Untitled';
                    490:                 if ($url =~ /\.sequence$/) {
                    491:                     $title .= ' Sequence';
                    492:                 } elsif ($url =~ /\.page$/) {
                    493:                     $title .= ' Page';
                    494:                 } elsif ($url =~ /\.problem$/) {
                    495:                     $title .= ' Problem';
                    496:                 } elsif ($url =~ /\.html$/) {
                    497:                     $title .= ' HTML document';
                    498:                 } elsif ($url =~ m:/syllabus$:) {
                    499:                     $title .= ' Syllabus';
                    500:                 } 
                    501:             }
1.82      www       502:             $_ = '<li>'.$title.' '.
1.226     schulted  503: 		&Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'0',$noformat).
1.82      www       504:                 '</li>'
1.226     schulted  505: 	    } split(/\s*\,\s*/,$value)).'</ul>';
1.46      www       506:     }
1.64      matthew   507:     # Evaluations
1.46      www       508:     if (($type eq 'clear') ||
                    509: 	($type eq 'depth') ||
                    510: 	($type eq 'helpful') ||
                    511: 	($type eq 'correct') ||
                    512: 	($type eq 'technical')) {
                    513: 	return &evalgraph($value);
                    514:     }
1.64      matthew   515:     # Difficulty
1.73      matthew   516:     if ($type eq 'difficulty' || $type eq 'disc') {
1.46      www       517: 	return &diffgraph($value);
                    518:     }
1.64      matthew   519:     # List of courses
1.46      www       520:     if ($type=~/\_list/) {
1.72      matthew   521:         my @Courses = split(/\s*\,\s*/,$value);
1.226     schulted  522:         my $Str='<ul class="LC_fontsize_medium">';
1.180     albertel  523: 	my %descriptions;
1.72      matthew   524:         foreach my $course (@Courses) {
1.154     albertel  525:             my %courseinfo =
                    526: 		&Apache::lonnet::coursedescription($course,
                    527: 						   {'one_time' => 1});
1.72      matthew   528:             if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') {
                    529:                 next;
                    530:             }
1.180     albertel  531: 	    $descriptions{join('\0',@courseinfo{'domain','description'})} .= 
                    532: 		'<li><a href="/public/'.$courseinfo{'domain'}.'/'.
1.72      matthew   533:                 $courseinfo{'num'}.'/syllabus" target="preview">'.
1.180     albertel  534:                 $courseinfo{'description'}.' ('.$courseinfo{'domain'}.
                    535: 		')</a></li>';
1.72      matthew   536:         }
1.180     albertel  537: 	foreach my $course (sort {lc($a) cmp lc($b)} (keys(%descriptions))) {
                    538: 	    $Str .= $descriptions{$course};
                    539: 	}
                    540: 
1.226     schulted  541: 	return $Str.'</ul>';
1.46      www       542:     }
1.64      matthew   543:     # No pretty print found
1.46      www       544:     return $value;
                    545: }
                    546: 
1.64      matthew   547: # Pretty input of metadata field
1.54      www       548: sub direct {
                    549:     return shift;
                    550: }
                    551: 
1.48      www       552: sub selectbox {
                    553:     my ($name,$value,$functionref,@idlist)=@_;
1.65      matthew   554:     if (! defined($functionref)) {
                    555:         $functionref=\&direct;
                    556:     }
1.48      www       557:     my $selout='<select name="'.$name.'">';
1.220     raeburn   558:     foreach my $id (@idlist) {
1.223     raeburn   559:         $selout.='<option value="'.$id.'"';
1.220     raeburn   560:         if ($id eq $value) {
1.228     raeburn   561: 	    $selout.=' selected="selected">'.&{$functionref}($id).'</option>';
1.220     raeburn   562:         } else {
                    563:             $selout.='>'.&{$functionref}($id).'</option>';
                    564:         }
1.48      www       565:     }
                    566:     return $selout.'</select>';
                    567: }
                    568: 
1.54      www       569: sub relatedfield {
                    570:     my ($show,$relatedsearchflag,$relatedsep,$fieldname,$relatedvalue)=@_;
1.65      matthew   571:     if (! $relatedsearchflag) { 
                    572:         return '';
                    573:     }
                    574:     if (! defined($relatedsep)) {
                    575:         $relatedsep=' ';
                    576:     }
                    577:     if (! $show) {
                    578:         return $relatedsep.'&nbsp;';
                    579:     }
1.54      www       580:     return $relatedsep.'<input type="checkbox" name="'.$fieldname.'_related"'.
1.229     bisitz    581: 	($relatedvalue?' checked="checked"':'').' />';
1.54      www       582: }
1.48      www       583: 
1.46      www       584: sub prettyinput {
1.54      www       585:     my ($type,$value,$fieldname,$formname,
1.116     banghart  586: 	$relatedsearchflag,$relatedsep,$relatedvalue,$size,$course_key)=@_;
1.75      matthew   587:     if (! defined($size)) {
                    588:         $size = 80;
                    589:     }
1.128     banghart  590:     my $output;
1.150     albertel  591:     if (defined($course_key) 
                    592: 	&& exists($env{$course_key.'.metadata.'.$type.'.options'})) {
1.116     banghart  593:         my $stu_add;
                    594:         my $only_one;
1.128     banghart  595:         my %meta_options;
                    596:         my @cur_values_inst;
                    597:         my $cur_values_stu;
1.132     banghart  598:         my $values = $env{$course_key.'.metadata.'.$type.'.values'};
                    599:         if ($env{$course_key.'.metadata.'.$type.'.options'} =~ m/stuadd/) {
1.116     banghart  600:             $stu_add = 'true';
                    601:         }
1.132     banghart  602:         if ($env{$course_key.'.metadata.'.$type.'.options'} =~ m/onlyone/) {
1.116     banghart  603:             $only_one = 'true';
                    604:         }
1.128     banghart  605:         # need to take instructor values out of list where instructor and student
                    606:         # values may be mixed.
1.133     banghart  607:         if ($values) {
1.132     banghart  608:             foreach my $item (split(/,/,$values)) {
                    609:                 $item =~ s/^\s+//;
1.133     banghart  610:                 $meta_options{$item} = $item;
1.128     banghart  611:             }
1.132     banghart  612:             foreach my $item (split(/,/,$value)) {
                    613:                 $item =~ s/^\s+//;
                    614:                 if ($meta_options{$item}) {
                    615:                     push(@cur_values_inst,$item);
1.128     banghart  616:                 } else {
1.201     raeburn   617:                     if ($item ne '') {
1.198     banghart  618:                         $cur_values_stu .= $item.',';
                    619:                     }
1.128     banghart  620:                 }
                    621:             }
1.202     raeburn   622:              $cur_values_stu =~ s/,$//;
1.197     banghart  623:             my @key_order = sort(keys(%meta_options));
1.203     albertel  624:             unshift(@key_order,'');
1.201     raeburn   625:             $meta_options{''} = 'Not specified';
1.197     banghart  626:             $meta_options{'select_form_order'} = \@key_order;
1.129     banghart  627:         } else {
                    628:             $cur_values_stu = $value;
1.128     banghart  629:         }
1.121     banghart  630:         if ($type eq 'courserestricted') {
1.138     banghart  631:             return (&select_course());
                    632:             # return ('<input type="hidden" name="new_courserestricted" value="'.$course_key.'" />');
1.121     banghart  633:         }
1.130     banghart  634:         if (($type eq 'keywords') || ($type eq 'subject')
                    635:              || ($type eq 'author')||($type eq  'notes')
1.174     banghart  636:              || ($type eq  'abstract')|| ($type eq  'title')|| ($type eq  'standards')
1.199     raeburn   637:              || (exists($env{$course_key.'.metadata.'.$type.'.added'}))) {
1.197     banghart  638:             
1.129     banghart  639:             if ($values) {
                    640:                 if ($only_one) {
1.134     banghart  641:                     $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,%meta_options));
1.129     banghart  642:                 } else {
1.130     banghart  643:                     $output .= (&Apache::loncommon::multiple_select_form('new_'.$type,\@cur_values_inst,undef,\%meta_options));
1.129     banghart  644:                 }
1.128     banghart  645:             }
                    646:             if ($stu_add) {
                    647:                 $output .= '<input type="text" name="'.$fieldname.'" size="'.$size.'" '.
                    648:                 'value="'.$cur_values_stu.'" />'.
                    649:                 &relatedfield(1,$relatedsearchflag,$relatedsep,$fieldname,
                    650:                       $relatedvalue); 
1.119     banghart  651:             }
1.128     banghart  652:             return ($output);
1.176     banghart  653:         } 
1.116     banghart  654:         if (($type eq 'lowestgradelevel') ||
                    655: 	    ($type eq 'highestgradelevel')) {
                    656: 	    return &Apache::loncommon::select_level_form($value,$fieldname).
                    657:             &relatedfield(0,$relatedsearchflag,$relatedsep); 
                    658:         }
                    659:         return(); 
                    660:     }
1.64      matthew   661:     # Language
1.48      www       662:     if ($type eq 'language') {
                    663: 	return &selectbox($fieldname,
                    664: 			  $value,
                    665: 			  \&Apache::loncommon::languagedescription,
1.54      www       666: 			  (&Apache::loncommon::languageids)).
1.64      matthew   667:                               &relatedfield(0,$relatedsearchflag,$relatedsep);
1.48      www       668:     }
1.64      matthew   669:     # Copyright
1.48      www       670:     if ($type eq 'copyright') {
                    671: 	return &selectbox($fieldname,
                    672: 			  $value,
                    673: 			  \&Apache::loncommon::copyrightdescription,
1.54      www       674: 			  (&Apache::loncommon::copyrightids)).
1.64      matthew   675:                               &relatedfield(0,$relatedsearchflag,$relatedsep);
1.48      www       676:     }
1.78      taceyjo1  677:     # Source Copyright
                    678:     if ($type eq 'sourceavail') {
                    679: 	return &selectbox($fieldname,
                    680: 			  $value,
                    681: 			  \&Apache::loncommon::source_copyrightdescription,
                    682: 			  (&Apache::loncommon::source_copyrightids)).
                    683:                               &relatedfield(0,$relatedsearchflag,$relatedsep);
                    684:     }
1.64      matthew   685:     # Gradelevels
1.48      www       686:     if (($type eq 'lowestgradelevel') ||
                    687: 	($type eq 'highestgradelevel')) {
1.54      www       688: 	return &Apache::loncommon::select_level_form($value,$fieldname).
1.64      matthew   689:             &relatedfield(0,$relatedsearchflag,$relatedsep);
1.48      www       690:     }
1.64      matthew   691:     # Obsolete
1.48      www       692:     if ($type eq 'obsolete') {
                    693: 	return '<input type="checkbox" name="'.$fieldname.'"'.
1.229     bisitz    694: 	    ($value?' checked="checked"':'').' />'.
1.64      matthew   695:             &relatedfield(0,$relatedsearchflag,$relatedsep); 
1.48      www       696:     }
1.64      matthew   697:     # Obsolete replacement file
1.48      www       698:     if ($type eq 'obsoletereplacement') {
                    699: 	return '<input type="text" name="'.$fieldname.
                    700: 	    '" size="60" value="'.$value.'" /><a href="javascript:openbrowser'.
                    701: 	    "('".$formname."','".$fieldname."'".
1.54      www       702: 	    ",'')\">".&mt('Select').'</a>'.
1.64      matthew   703:             &relatedfield(0,$relatedsearchflag,$relatedsep); 
                    704:     }
                    705:     # Customdistribution file
1.48      www       706:     if ($type eq 'customdistributionfile') {
                    707: 	return '<input type="text" name="'.$fieldname.
                    708: 	    '" size="60" value="'.$value.'" /><a href="javascript:openbrowser'.
                    709: 	    "('".$formname."','".$fieldname."'".
1.54      www       710: 	    ",'rights')\">".&mt('Select').'</a>'.
1.64      matthew   711:             &relatedfield(0,$relatedsearchflag,$relatedsep); 
1.48      www       712:     }
1.78      taceyjo1  713:     # Source Customdistribution file
                    714:     if ($type eq 'sourcerights') {
                    715: 	return '<input type="text" name="'.$fieldname.
                    716: 	    '" size="60" value="'.$value.'" /><a href="javascript:openbrowser'.
                    717: 	    "('".$formname."','".$fieldname."'".
                    718: 	    ",'rights')\">".&mt('Select').'</a>'.
                    719:             &relatedfield(0,$relatedsearchflag,$relatedsep); 
                    720:     }
1.135     banghart  721:     if ($type eq 'courserestricted') {
1.138     banghart  722:         return (&select_course());
                    723:         #return ('<input type="hidden" name="new_courserestricted" value="'.$course_key.'" />');
1.135     banghart  724:     }
                    725: 
1.64      matthew   726:     # Dates
1.48      www       727:     if (($type eq 'creationdate') ||
                    728: 	($type eq 'lastrevisiondate')) {
1.64      matthew   729: 	return 
                    730:             &Apache::lonhtmlcommon::date_setter($formname,$fieldname,$value).
                    731:             &relatedfield(0,$relatedsearchflag,$relatedsep);
1.48      www       732:     }
1.64      matthew   733:     # No pretty input found
1.48      www       734:     $value=~s/^\s+//gs;
                    735:     $value=~s/\s+$//gs;
                    736:     $value=~s/\s+/ /gs;
1.77      matthew   737:     $value=~s/\"/\&quot\;/gs;
1.54      www       738:     return 
1.74      matthew   739:         '<input type="text" name="'.$fieldname.'" size="'.$size.'" '.
1.64      matthew   740:         'value="'.$value.'" />'.
                    741:         &relatedfield(1,$relatedsearchflag,$relatedsep,$fieldname,
                    742:                       $relatedvalue); 
1.46      www       743: }
                    744: 
1.64      matthew   745: # Main Handler
1.1       www       746: sub handler {
1.64      matthew   747:     my $r=shift;
1.169     banghart  748:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.188     banghart  749:          ['currentpath','changecourse']);
1.67      matthew   750:     my $uri=$r->uri;
                    751:     #
                    752:     # Set document type
                    753:     &Apache::loncommon::content_type($r,'text/html');
                    754:     $r->send_http_header;
                    755:     return OK if $r->header_only;
1.76      matthew   756:     my ($resdomain,$resuser)=
1.190     albertel  757:         (&Apache::lonnet::declutter($uri)=~/^($match_domain)\/($match_username)\//);
1.66      matthew   758:     if ($uri=~m:/adm/bombs/(.*)$:) {
1.153     albertel  759:         $r->print(&Apache::loncommon::start_page('Error Messages'));
1.66      matthew   760:         # Looking for all bombs?
                    761:         &report_bombs($r,$uri);
1.162     albertel  762:     } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/portfolio/|) {
1.140     banghart  763: 	    ($resdomain,$resuser)=
1.190     albertel  764: 		(&Apache::lonnet::declutter($uri)=~m|^($match_domain)/($match_name)/portfolio|);
1.225     schafran  765:         $r->print(&Apache::loncommon::start_page('Edit Portfolio File Metadata',
1.153     albertel  766: 						 undef,
                    767: 						 {'domain' => $resdomain,}));
1.140     banghart  768:         if ($env{'form.store'}) {
                    769:             &present_editable_metadata($r,$uri,'portfolio');
                    770:         } else {
1.186     banghart  771:             my $fn=&Apache::lonnet::filelocation('',$uri);
                    772:             %Apache::lonpublisher::metadatafields=();
                    773:             %Apache::lonpublisher::metadatakeys=();
                    774:             my $result=&Apache::lonnet::getfile($fn);
                    775:             &Apache::lonpublisher::metaeval($result);
1.188     banghart  776:             if ((!$Apache::lonpublisher::metadatafields{'courserestricted'}) ||
                    777:                 ($env{'form.changecourse'} eq 'true')) {
1.186     banghart  778:                 &pre_select_course($r,$uri);
                    779:             } else {
                    780:                 &present_editable_metadata($r,$uri,'portfolio');
                    781:             }
1.140     banghart  782:         }
1.171     banghart  783:     } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/groups/|) {
1.225     schafran  784:         $r->print(&Apache::loncommon::start_page('Edit Group Portfolio File Metadata',
1.171     banghart  785: 						 undef,
                    786: 						 {'domain' => $resdomain,}));
1.172     banghart  787:         &present_editable_metadata($r,$uri,'groups');    
1.162     albertel  788:     } elsif ($uri=~m|^/~|) { 
1.66      matthew   789:         # Construction space
1.225     schafran  790:         $r->print(&Apache::loncommon::start_page('Edit Metadata',
1.204     banghart  791: 						"\n".'<script type="text/javascript">'."\n".
                    792:                                                 &Apache::loncommon::browser_and_searcher_javascript().
                    793:                                                 "\n".'</script>',
1.153     albertel  794: 						 {'domain' => $resdomain,}));
1.66      matthew   795:         &present_editable_metadata($r,$uri);
                    796:     } else {
1.214     schafran  797:         $r->print(&Apache::loncommon::start_page('Metadata',
1.153     albertel  798: 						 undef,
                    799: 						 {'domain' => $resdomain,}));
1.66      matthew   800:         &present_uneditable_metadata($r,$uri);
                    801:     }
1.153     albertel  802:     $r->print(&Apache::loncommon::end_page());
1.66      matthew   803:     return OK;
                    804: }
                    805: 
1.67      matthew   806: #####################################################
                    807: #####################################################
                    808: ###                                               ###
                    809: ###                Report Bombs                   ###
                    810: ###                                               ###
                    811: #####################################################
                    812: #####################################################
1.66      matthew   813: sub report_bombs {
                    814:     my ($r,$uri) = @_;
                    815:     # Set document type
1.67      matthew   816:     $uri =~ s:/adm/bombs/::;
                    817:     $uri = &Apache::lonnet::declutter($uri);
1.66      matthew   818:     $r->print('<h1>'.&Apache::lonnet::clutter($uri).'</h1>');
1.190     albertel  819:     my ($domain,$author)=($uri=~/^($match_domain)\/($match_username)\//);
1.66      matthew   820:     if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) {
1.98      www       821: 	if ($env{'form.clearbombs'}) {
                    822: 	    &Apache::lonmsg::clear_author_res_msg($uri);
                    823: 	}
                    824:         my $clear=&mt('Clear all Messages in Subdirectory');
1.212     www       825:         my $cancel=&mt('Back to Directory');
                    826:         my $cancelurl=$uri;
                    827:         $cancelurl=~s/^\Q$domain\E/\/priv/;
                    828:         $r->print(<<ENDCLEAR);
1.98      www       829: <form method="post">
                    830: <input type="submit" name="clearbombs" value="$clear" />
1.212     www       831: <a href="$cancelurl">$cancel</a>
                    832: </form><hr />
1.98      www       833: ENDCLEAR
1.67      matthew   834:         my %brokenurls = 
                    835:             &Apache::lonmsg::all_url_author_res_msg($author,$domain);
1.220     raeburn   836:         foreach my $key (sort(keys(%brokenurls))) {
                    837:             if ($key=~/^\Q$uri\E/) {
1.70      matthew   838:                 $r->print
1.220     raeburn   839:                     ('<a href="'.&Apache::lonnet::clutter($key).'">'.$key.'</a>'.
                    840:                      &Apache::lonmsg::retrieve_author_res_msg($key).
1.70      matthew   841:                      '<hr />');
1.64      matthew   842:             }
                    843:         }
1.66      matthew   844:     } else {
                    845:         $r->print(&mt('Not authorized'));
                    846:     }
                    847:     return;
                    848: }
                    849: 
1.67      matthew   850: #####################################################
                    851: #####################################################
                    852: ###                                               ###
                    853: ###        Uneditable Metadata Display            ###
                    854: ###                                               ###
                    855: #####################################################
                    856: #####################################################
1.66      matthew   857: sub present_uneditable_metadata {
                    858:     my ($r,$uri) = @_;
                    859:     #
1.162     albertel  860:     my $uploaded = ($uri =~ m|/uploaded/|);
1.66      matthew   861:     my %content=();
                    862:     # Read file
1.220     raeburn   863:     foreach my $key (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {
                    864:         $content{$key}=&Apache::lonnet::metadata($uri,$key);
1.66      matthew   865:     }
                    866:     # Render Output
                    867:     # displayed url
                    868:     my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/);
                    869:     $uri=~s/\.meta$//;
1.183     albertel  870:     my $disuri=&Apache::lonnet::clutter_with_no_wrapper($uri);
1.66      matthew   871:     # version
                    872:     my $versiondisplay='';
1.162     albertel  873:     if (!$uploaded) {
                    874: 	my $currentversion=&Apache::lonnet::getversion($disuri);
                    875: 	if ($thisversion) {
                    876: 	    $versiondisplay=&mt('Version').': '.$thisversion.
                    877: 		' ('.&mt('most recent version').': '.
                    878: 		($currentversion>0 ? 
                    879: 		 $currentversion   :
                    880: 		 &mt('information not available')).')';
                    881: 	} else {
                    882: 	    $versiondisplay='Version: '.$currentversion;
                    883: 	}
1.66      matthew   884:     }
1.72      matthew   885:     # crumbify displayed URL               uri     target prefix form  size
                    886:     $disuri=&Apache::lonhtmlcommon::crumbs($disuri,undef, undef, undef,'+1');
                    887:     $disuri =~ s:<br />::g;
1.66      matthew   888:     # obsolete
                    889:     my $obsolete=$content{'obsolete'};
                    890:     my $obsoletewarning='';
1.96      albertel  891:     if (($obsolete) && ($env{'user.adv'})) {
1.218     bisitz    892:         $obsoletewarning='<p><span class="LC_warning">'.
1.66      matthew   893:             &mt('This resource has been marked obsolete by the author(s)').
1.218     bisitz    894:             '</span></p>';
1.66      matthew   895:     }
                    896:     #
                    897:     my %lt=&fieldnames();
                    898:     my $table='';
1.72      matthew   899:     my $title = $content{'title'};
                    900:     if (! defined($title)) {
                    901:         $title = 'Untitled Resource';
                    902:     }
1.163     albertel  903:     my @fields;
                    904:     if ($uploaded) {
                    905: 	@fields = ('title','author','subject','keywords','notes','abstract',
                    906: 		   'lowestgradelevel','highestgradelevel','standards','mime',
                    907: 		   'owner');
                    908:     } else {
                    909: 	@fields = ('title', 
                    910: 		   'author', 
                    911: 		   'subject', 
                    912: 		   'keywords', 
                    913: 		   'notes', 
                    914: 		   'abstract',
                    915: 		   'lowestgradelevel',
                    916: 		   'highestgradelevel',
                    917: 		   'standards', 
                    918: 		   'mime', 
                    919: 		   'language', 
                    920: 		   'creationdate', 
                    921: 		   'lastrevisiondate', 
                    922: 		   'owner', 
                    923: 		   'copyright', 
                    924: 		   'customdistributionfile',
                    925: 		   'sourceavail',
                    926: 		   'sourcerights', 
                    927: 		   'obsolete', 
                    928: 		   'obsoletereplacement');
                    929:     }
1.222     raeburn   930:     my $rownum = 0;
1.163     albertel  931:     foreach my $field (@fields) {
1.222     raeburn   932:         my $lastrow = '';
                    933:         $rownum ++;
                    934:         $lastrow = 1 if ($rownum == @fields); 
1.218     bisitz    935:         $table.=&Apache::lonhtmlcommon::row_title($lt{$field})
                    936:                .&prettyprint($field,$content{$field})
1.222     raeburn   937:                .&Apache::lonhtmlcommon::row_closure($lastrow);
1.163     albertel  938:         delete($content{$field});
1.66      matthew   939:     }
                    940:     #
1.218     bisitz    941:     $r->print("<h2>$title</h2>"
                    942:              .'<p>'
                    943:              .$disuri.'<br />'
                    944:              .$obsoletewarning
                    945:              .$versiondisplay
                    946:              .'</p>'
                    947:              .&Apache::lonhtmlcommon::start_pick_box()
                    948:              .$table
                    949:              .&Apache::lonhtmlcommon::end_pick_box()
                    950:     );
1.162     albertel  951:     if (!$uploaded && $env{'user.adv'}) {
1.68      matthew   952:         &print_dynamic_metadata($r,$uri,\%content);
1.67      matthew   953:     }
                    954:     return;
                    955: }
                    956: 
                    957: sub print_dynamic_metadata {
1.68      matthew   958:     my ($r,$uri,$content) = @_;
                    959:     #
1.69      matthew   960:     my %content = %$content;
1.68      matthew   961:     my %lt=&fieldnames();
1.67      matthew   962:     #
                    963:     my $description = 'Dynamic Metadata (updated periodically)';
                    964:     $r->print('<h3>'.&mt($description).'</h3>'.
1.70      matthew   965:               &mt('Processing'));
1.67      matthew   966:     $r->rflush();
                    967:     my %items=&fieldnames();
                    968:     my %dynmeta=&dynamicmeta($uri);
                    969:     #
                    970:     # General Access and Usage Statistics
1.230     bisitz    971:     $r->print('<h4>'.&mt('Access and Usage Statistics').'</h4>');
1.70      matthew   972:     if (exists($dynmeta{'count'}) ||
                    973:         exists($dynmeta{'sequsage'}) ||
                    974:         exists($dynmeta{'comefrom'}) ||
                    975:         exists($dynmeta{'goto'}) ||
                    976:         exists($dynmeta{'course'})) {
1.230     bisitz    977:         $r->print(&Apache::lonhtmlcommon::start_pick_box());
1.222     raeburn   978:         my @counts = ('count','sequsage','sequsage_list',
                    979:                       'comefrom','comefrom_list','goto',
                    980:                       'goto_list','course','course_list');
                    981:         my $rownum = 0;
                    982:         foreach my $item (@counts) {
                    983:             my $lastrow = '';
                    984:             $rownum ++;
                    985:             $lastrow = 1 if ($rownum == @counts);
1.220     raeburn   986:             $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
                    987:                      .&prettyprint($item,$dynmeta{$item})
1.222     raeburn   988:                      .&Apache::lonhtmlcommon::row_closure($lastrow)
1.218     bisitz    989:             );
1.70      matthew   990:         }
1.218     bisitz    991:         $r->print(&Apache::lonhtmlcommon::end_pick_box());
1.70      matthew   992:     } else {
1.230     bisitz    993:         $r->print('<p>'
                    994:                  .&mt('No Access or Usages Statistics are available for this resource.')
                    995:                  .'</p>'
                    996:         );
1.67      matthew   997:     }
1.69      matthew   998:     #
                    999:     # Assessment statistics
1.73      matthew  1000:     if ($uri=~/\.(problem|exam|quiz|assess|survey|form)$/) {
                   1001:         if (exists($dynmeta{'stdno'}) ||
                   1002:             exists($dynmeta{'avetries'}) ||
                   1003:             exists($dynmeta{'difficulty'}) ||
                   1004:             exists($dynmeta{'disc'})) {
                   1005:             # This is an assessment, print assessment data
                   1006:             $r->print('<h4>'.
                   1007:                       &mt('Overall Assessment Statistical Data').
                   1008:                       '</h4>'.
1.218     bisitz   1009:                       &Apache::lonhtmlcommon::start_pick_box());
                   1010:             $r->print(&Apache::lonhtmlcommon::row_title($lt{'stdno'})
                   1011:                      .&prettyprint('stdno',$dynmeta{'stdno'})
                   1012:                      .&Apache::lonhtmlcommon::row_closure()
                   1013:             );
1.222     raeburn  1014:             my @stats = ('avetries','difficulty','disc');
                   1015:             my $rownum = 0;
                   1016:             foreach my $item (@stats) {
                   1017:                 my $lastrow = '';
                   1018:                 $rownum ++;
                   1019:                 $lastrow = 1 if ($rownum == @stats);
1.220     raeburn  1020:                 $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
                   1021:                          .&prettyprint($item,sprintf('%5.2f',$dynmeta{$item}))
1.222     raeburn  1022:                          .&Apache::lonhtmlcommon::row_closure($lastrow)
1.218     bisitz   1023:                 );
1.73      matthew  1024:             }
1.218     bisitz   1025:             $r->print(&Apache::lonhtmlcommon::end_pick_box());
1.73      matthew  1026:         }
1.230     bisitz   1027:         #
                   1028:         # New assessment statistics
                   1029:         $r->print('<h4>'
                   1030:                  .&mt('Recent Detailed Assessment Statistical Data')
                   1031:                  .'</h4>'
                   1032:         );
1.73      matthew  1033:         if (exists($dynmeta{'stats'})) {
1.218     bisitz   1034:             my $table=&Apache::loncommon::start_data_table()
                   1035:                      .&Apache::loncommon::start_data_table_header_row()
                   1036:                      .'<th>'.&mt('Course').'</th>'
                   1037:                      .'<th>'.&mt('Section(s)').'</th>'
                   1038:                      .'<th>'.&mt('Num Students').'</th>'
                   1039:                      .'<th>'.&mt('Mean Tries').'</th>'
                   1040:                      .'<th>'.&mt('Degree of Difficulty').'</th>'
                   1041:                      .'<th>'.&mt('Degree of Discrimination').'</th>'
                   1042:                      .'<th>'.&mt('Time of computation').'</th>'
                   1043:                      .&Apache::loncommon::end_data_table_header_row().$/;
1.73      matthew  1044:             foreach my $identifier (sort(keys(%{$dynmeta{'stats'}}))) {
                   1045:                 my $data = $dynmeta{'stats'}->{$identifier};
                   1046:                 my $course = $data->{'course'};
1.154     albertel 1047:                 my %courseinfo = 
                   1048: 		    &Apache::lonnet::coursedescription($course,
                   1049: 						       {'one_time' => 1});
1.73      matthew  1050:                 if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') {
                   1051:                     &Apache::lonnet::logthis('lookup for '.$course.' failed');
                   1052:                     next;
                   1053:                 }
1.218     bisitz   1054:                 $table .= &Apache::loncommon::start_data_table_row();
1.73      matthew  1055:                 $table .= 
1.218     bisitz   1056:                     '<td><span class="LC_nobreak">'.$courseinfo{'description'}.'</span></td>';
1.73      matthew  1057:                 $table .= 
                   1058:                     '<td align="right">'.$data->{'sections'}.'</td>';
                   1059:                 $table .=
                   1060:                     '<td align="right">'.$data->{'stdno'}.'</td>';
1.220     raeburn  1061:                 foreach my $item ('avetries','difficulty','disc') {
1.73      matthew  1062:                     $table .= '<td align="right">';
1.220     raeburn  1063:                     if (exists($data->{$item})) {
                   1064:                         $table .= sprintf('%.2f',$data->{$item}).'&nbsp;';
1.73      matthew  1065:                     } else {
                   1066:                         $table .= '';
                   1067:                     }
                   1068:                     $table .= '</td>';
                   1069:                 }
                   1070:                 $table .=
1.218     bisitz   1071:                     '<td><span class="LC_nobreak">'.
1.73      matthew  1072:                     &Apache::lonlocal::locallocaltime($data->{'timestamp'}).
1.218     bisitz   1073:                     '</span></td>';
                   1074:                 $table .= &Apache::loncommon::end_data_table_row().$/;
1.73      matthew  1075:             }
1.218     bisitz   1076:             $table .= &Apache::loncommon::end_data_table().$/;
1.73      matthew  1077:             $r->print($table);
                   1078:         } else {
1.230     bisitz   1079:             $r->print('<p>'
                   1080:                      .&mt('No new dynamic data found.')
                   1081:                      .'</p>'
                   1082:             );
1.66      matthew  1083:         }
1.70      matthew  1084:     } else {
1.73      matthew  1085:         $r->print('<h4>'.
                   1086:           &mt('No Assessment Statistical Data is available for this resource').
                   1087:                   '</h4>');
1.67      matthew  1088:     }
1.73      matthew  1089: 
                   1090:     #
1.230     bisitz   1091:     # Evaluation Data
                   1092:     $r->print('<h4>'.&mt('Evaluation Data').'</h4>');
1.70      matthew  1093:     if (exists($dynmeta{'clear'})   || 
                   1094:         exists($dynmeta{'depth'})   || 
                   1095:         exists($dynmeta{'helpful'}) || 
                   1096:         exists($dynmeta{'correct'}) || 
                   1097:         exists($dynmeta{'technical'})){ 
1.230     bisitz   1098:         $r->print(&Apache::lonhtmlcommon::start_pick_box());
1.222     raeburn  1099:         my @criteria = ('clear','depth','helpful','correct','technical');
                   1100:         my $rownum = 0;
                   1101:         foreach my $item (@criteria) {
                   1102:             my $lastrow = '';
                   1103:             $rownum ++;
                   1104:             $lastrow = 1 if ($rownum == @criteria);
1.220     raeburn  1105:             $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
                   1106:                      .&prettyprint($item,$dynmeta{$item})
1.222     raeburn  1107:                      .&Apache::lonhtmlcommon::row_closure($lastrow)
1.218     bisitz   1108:             );
1.70      matthew  1109:         }
1.218     bisitz   1110:         $r->print(&Apache::lonhtmlcommon::end_pick_box());
1.70      matthew  1111:     } else {
1.230     bisitz   1112:         $r->print('<p>'
                   1113:                  .&mt('No Evaluation Data is available for this resource.')
                   1114:                  .'</p>'
                   1115:         );
1.67      matthew  1116:     }
1.230     bisitz   1117:     # Evaluation Comments
1.190     albertel 1118:     $uri=~/^\/res\/($match_domain)\/($match_username)\//; 
1.96      albertel 1119:     if ((($env{'user.domain'} eq $1) && ($env{'user.name'} eq $2))
                   1120:         || ($env{'user.role.ca./'.$1.'/'.$2})) {
1.230     bisitz   1121:         $r->print('<h4>'.&mt('Evaluation Comments').'</h4>'
                   1122:                  .'<div>('
                   1123:                  .&mt('visible to author and co-authors only')
                   1124:                  .')</div>'
                   1125:         );
1.232     bisitz   1126:         if (exists($dynmeta{'comments'})) {
1.230     bisitz   1127:             $r->print('<blockquote>'.$dynmeta{'comments'}.'</blockquote>');
1.70      matthew  1128:         } else {
1.230     bisitz   1129:             $r->print('<p>'
                   1130:                      .&mt('There are no Evaluation Comments on this resource.')
                   1131:                      .'</p>'
                   1132:             );
1.70      matthew  1133:         }
                   1134:         my $bombs = &Apache::lonmsg::retrieve_author_res_msg($uri);
                   1135:         if (defined($bombs) && $bombs ne '') {
1.230     bisitz   1136:             $r->print('<a name="bombs" />'
                   1137:                      .'<h4 class="LC_error">'.&mt('Error Messages').'</h4>'
                   1138:                      .'<div>('
                   1139:                      .&mt('visible to author and co-authors only')
                   1140:                      .')</div>'
                   1141:                      .$bombs
                   1142:             );
                   1143:         } #else {
                   1144:         #    $r->print('<h4>'.&mt('There are currently no Error Messages for this resource.').'</h4>');
                   1145:         #}
1.67      matthew  1146:     }
1.69      matthew  1147:     #
1.67      matthew  1148:     # All other stuff
                   1149:     $r->print('<h3>'.
                   1150:               &mt('Additional Metadata (non-standard, parameters, exports)').
1.218     bisitz   1151:               '</h3>');
                   1152:     $r->print(&Apache::lonhtmlcommon::start_pick_box());
1.222     raeburn  1153:     my @names;
                   1154:     foreach my $key (sort(keys(%content))) {
                   1155:         if ($key!~/\.display$/) {
                   1156:             push(@names,$key);
                   1157:         }
                   1158:     }
                   1159:     if (@names > 0) {
                   1160:         my $rownum = 0;
                   1161:         foreach my $name (@names) {
                   1162:             my $lastrow = '';
                   1163:             $rownum ++;
                   1164:             $lastrow = 1 if ($rownum == @names);
                   1165: 
1.67      matthew  1166:             my $display=&Apache::lonnet::metadata($uri,
                   1167:                                                   $name.'.display');
                   1168:             if (! $display) { 
                   1169:                 $display=$name;
                   1170:             };
                   1171:             my $otherinfo='';
1.220     raeburn  1172:             foreach my $item ('name','part','type','default') {
1.67      matthew  1173:                 if (defined(&Apache::lonnet::metadata($uri,
1.220     raeburn  1174:                                                       $name.'.'.$item))) {
                   1175:                     $otherinfo.=' '.$item.'='.
1.67      matthew  1176:                         &Apache::lonnet::metadata($uri,
1.220     raeburn  1177:                                                   $name.'.'.$item).'; ';
1.67      matthew  1178:                 }
1.64      matthew  1179:             }
1.218     bisitz   1180:             $r->print(&Apache::lonhtmlcommon::row_title($display)
                   1181:                      .$content{$name}
                   1182:             );
1.67      matthew  1183:             if ($otherinfo) {
                   1184:                 $r->print(' ('.$otherinfo.')');
1.64      matthew  1185:             }
1.222     raeburn  1186:             $r->print(&Apache::lonhtmlcommon::row_closure($lastrow));
1.64      matthew  1187:         }
1.66      matthew  1188:     }
1.218     bisitz   1189:     $r->print(&Apache::lonhtmlcommon::end_pick_box());
1.67      matthew  1190:     return;
1.66      matthew  1191: }
1.105     banghart 1192: 
1.102     banghart 1193: 
                   1194: 
1.67      matthew  1195: #####################################################
                   1196: #####################################################
                   1197: ###                                               ###
                   1198: ###          Editable metadata display            ###
                   1199: ###                                               ###
                   1200: #####################################################
                   1201: #####################################################
1.66      matthew  1202: sub present_editable_metadata {
1.172     banghart 1203:     my ($r,$uri,$file_type) = @_;
1.66      matthew  1204:     # Construction Space Call
                   1205:     # Header
                   1206:     my $disuri=$uri;
                   1207:     my $fn=&Apache::lonnet::filelocation('',$uri);
1.155     albertel 1208:     $disuri=~s{^/\~}{/priv/};
1.66      matthew  1209:     $disuri=~s/\.meta$//;
1.141     albertel 1210:     my $meta_uri = $disuri;
1.147     albertel 1211:     my $path;
1.141     albertel 1212:     if ($disuri =~ m|/portfolio/|) {
1.147     albertel 1213: 	($disuri, $meta_uri, $path) =  &portfolio_display_uri($disuri,1);
1.141     albertel 1214:     }
1.66      matthew  1215:     my $target=$uri;
1.155     albertel 1216:     $target=~s{^/\~}{/res/$env{'request.role.domain'}/};
1.66      matthew  1217:     $target=~s/\.meta$//;
                   1218:     my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target);
                   1219:     if ($bombs) {
1.99      www      1220:         my $showdel=1;
1.96      albertel 1221:         if ($env{'form.delmsg'}) {
1.66      matthew  1222:             if (&Apache::lonmsg::del_url_author_res_msg($target) eq 'ok') {
                   1223:                 $bombs=&mt('Messages deleted.');
1.99      www      1224: 		$showdel=0;
1.66      matthew  1225:             } else {
                   1226:                 $bombs=&mt('Error deleting messages');
1.64      matthew  1227:             }
1.66      matthew  1228:         }
1.98      www      1229:         if ($env{'form.clearmsg'}) {
                   1230: 	    my $cleardir=$target;
                   1231: 	    $cleardir=~s/\/[^\/]+$/\//;
                   1232:             if (&Apache::lonmsg::clear_author_res_msg($cleardir) eq 'ok') {
                   1233:                 $bombs=&mt('Messages cleared.');
1.99      www      1234: 		$showdel=0;
1.98      www      1235:             } else {
                   1236:                 $bombs=&mt('Error clearing messages');
                   1237:             }
                   1238:         }
                   1239:         my $del=&mt('Delete Messages for this Resource');
                   1240: 	my $clear=&mt('Clear all Messages in Subdirectory');
1.99      www      1241: 	my $goback=&mt('Back to Source File');
1.66      matthew  1242:         $r->print(<<ENDBOMBS);
1.52      www      1243: <h1>$disuri</h1>
1.169     banghart 1244: <form method="post" action="" name="defaultmeta">
1.99      www      1245: ENDBOMBS
                   1246:         if ($showdel) {
                   1247: 	    $r->print(<<ENDDEL);
1.59      www      1248: <input type="submit" name="delmsg" value="$del" />
1.98      www      1249: <input type="submit" name="clearmsg" value="$clear" />
1.99      www      1250: ENDDEL
                   1251:         } else {
1.208     albertel 1252:             $r->print('<p><a href="'.$disuri.'">'.$goback.'</a></p>');
1.203     albertel 1253: 	    if ($env{'form.clearmsg'}) {
                   1254: 		my ($diruri) = ($disuri =~ m{(.*/)[^/]*});
1.208     albertel 1255: 		$r->print('<p><a href="'.$diruri.'">'.
1.203     albertel 1256: 			  &mt('Back To Directory').'</a></p>');
                   1257: 	    }
1.99      www      1258: 	}
                   1259: 	$r->print('<br />'.$bombs);
1.66      matthew  1260:     } else {
1.214     schafran 1261:         my $displayfile=&mt('Metadata for [_1]',$disuri);
1.66      matthew  1262:         if ($disuri=~/\/default$/) {
                   1263:             my $dir=$disuri;
                   1264:             $dir=~s/default$//;
1.233   ! bisitz   1265:             $displayfile=&mt('Default Metadata for Directory [_1]'
        !          1266:                             ,'<span class="LC_filename">'.$dir.'</span>');
1.66      matthew  1267:         }
                   1268:         %Apache::lonpublisher::metadatafields=();
                   1269:         %Apache::lonpublisher::metadatakeys=();
1.94      banghart 1270:         my $result=&Apache::lonnet::getfile($fn);
                   1271:         if ($result == -1){
1.141     albertel 1272: 	    $r->print(&mt('Creating new file [_1]'),$meta_uri);
1.94      banghart 1273:         } else {
                   1274:             &Apache::lonpublisher::metaeval($result);
                   1275:         }
1.200     raeburn  1276:         if ($env{'form.new_courserestricted'}) {
                   1277:             my $new_assoc_course = $env{'form.new_courserestricted'};
                   1278:             my $prev_courserestricted = $Apache::lonpublisher::metadatafields{'courserestricted'};
                   1279:             if (($prev_courserestricted) && 
                   1280:                 ($prev_courserestricted ne $new_assoc_course)) {
                   1281:                 my $transfers = [];
                   1282:                 foreach my $key (keys(%env)) {
                   1283:                     if ($key =~ /^form\.transfer_(.+)$/) {
                   1284:                         push(@{$transfers},$1);
                   1285:                     }
                   1286:                 }
                   1287:                 if (@{$transfers} > 0) {
                   1288:                     &store_transferred_addedfields($fn,$uri,$transfers);
                   1289:                 }
                   1290:             }
                   1291:         }
1.66      matthew  1292:         $r->print(<<ENDEDIT);
1.233   ! bisitz   1293: <p>$displayfile</p>
1.169     banghart 1294: <form method="post" action="" name="defaultmeta">
1.23      www      1295: ENDEDIT
1.90      banghart 1296:         my %lt=&fieldnames($file_type);
1.87      albertel 1297: 	my $output;
1.90      banghart 1298: 	my @fields;
1.174     banghart 1299: 	my $added_metadata_fields;
1.184     banghart 1300: 	my @added_order;
1.195     raeburn  1301:         if ($file_type eq 'groups') {
                   1302:             $Apache::lonpublisher::metadatafields{'courserestricted'}=
                   1303:                 'course.'.$env{'request.course.id'};
                   1304:         }
                   1305:         if ((! $Apache::lonpublisher::metadatafields{'courserestricted'}) &&
                   1306:                 (! $env{'form.new_courserestricted'}) && (! $file_type eq 'groups')) {
                   1307:             $Apache::lonpublisher::metadatafields{'courserestricted'}=
                   1308:                 'none';
                   1309:         } elsif ($env{'form.new_courserestricted'}) {
                   1310:             $Apache::lonpublisher::metadatafields{'courserestricted'}=
                   1311:                 $env{'form.new_courserestricted'};
                   1312:         }
1.178     raeburn  1313: 	if ($file_type eq 'portfolio' || $file_type eq 'groups') {
1.174     banghart 1314: 	    if(exists ($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'})) {
                   1315: 	        # retrieve fieldnames (in order) from the course restricted list
1.185     albertel 1316: 	        @fields = (split(/,/,$env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'}));
1.174     banghart 1317: 	    } else {
                   1318: 	        # no saved field list, use default list
                   1319: 	        @fields =  ('author','title','subject','keywords','abstract',
                   1320: 			    'notes','lowestgradelevel',
                   1321: 	                    'highestgradelevel','standards');
1.195     raeburn  1322:                 if ($Apache::lonpublisher::metadatafields{'courserestricted'} =~ /^course\.($match_domain\_$match_courseid)$/) {
                   1323:                     my $assoc_crs = $1;
                   1324: 	            $added_metadata_fields = &Apache::lonparmset::get_added_meta_fieldnames($assoc_crs);
                   1325: 	            if ($env{'course.'.$assoc_crs.'.metadata.addedorder'}) {
                   1326: 	                @added_order = split(/,/,$env{'course.'.$assoc_crs.'.metadata.addedorder'});
                   1327: 	            }
                   1328: 	            $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.fieldlist'} = join(",",@fields);
                   1329:                 }
1.174     banghart 1330: 	    }
1.90      banghart 1331: 	} else {
                   1332: 	    @fields = ('author','title','subject','keywords','abstract','notes',
1.185     albertel 1333: 		       'copyright','customdistributionfile','language',
                   1334: 		       'standards',
                   1335: 		       'lowestgradelevel','highestgradelevel','sourceavail','sourcerights',
                   1336: 		       'obsolete','obsoletereplacement');
1.90      banghart 1337:         }
1.120     banghart 1338:         if (! $Apache::lonpublisher::metadatafields{'copyright'}) {
                   1339:                 $Apache::lonpublisher::metadatafields{'copyright'}=
1.163     albertel 1340: 		    'default';
1.120     banghart 1341:         }
1.172     banghart 1342: 	if (($file_type eq 'portfolio') || ($file_type eq 'groups'))  {
1.163     albertel 1343: 	    if (! $Apache::lonpublisher::metadatafields{'mime'}) {
                   1344:                 ($Apache::lonpublisher::metadatafields{'mime'}) =
                   1345: 		    ( $target=~/\.(\w+)$/ );
                   1346: 	    }
                   1347: 	    if (! $Apache::lonpublisher::metadatafields{'owner'}) {
                   1348: 		$Apache::lonpublisher::metadatafields{'owner'} =
                   1349: 		    $env{'user.name'}.':'.$env{'user.domain'};
                   1350: 	    }
1.209     albertel 1351: 	    if (! $Apache::lonpublisher::metadatafields{'author'}) {
                   1352: 		$Apache::lonpublisher::metadatafields{'author'} =
                   1353: 		    &Apache::loncommon::plainname($env{'user.name'},
                   1354: 						  $env{'user.domain'});
                   1355: 	    }
1.197     banghart 1356: 	    if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none') {
1.163     albertel 1357: 
1.191     raeburn  1358:                 if ($file_type eq 'portfolio') {
                   1359: 		    $r->print(&mt('Associated with course [_1]',
1.188     banghart 1360: 		        '<strong><a href="'.$uri.'?changecourse=true">'.
                   1361: 		        $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.
                   1362: 		        ".description"}.
                   1363: 			      '</a></strong>').'<br />');
1.191     raeburn  1364:                 } else {
                   1365:                     $r->print(&mt('Associated with course [_1]',
                   1366:                         '<strong>'.
                   1367:   $env{$Apache::lonpublisher::metadatafields{'courserestricted'}.
                   1368:                         ".description"}.'</strong>').'<br />');
                   1369:                 }
1.149     albertel 1370: 	    } else {
1.210     bisitz   1371: 		$r->print('<a href="'.$uri.'?changecourse=true">'.&mt('This resource is not associated with a course.').'</a><br />');
1.149     albertel 1372: 	    }
                   1373: 	}
1.184     banghart 1374: 	if (@added_order) {
1.185     albertel 1375: 	    foreach my $field_name (@added_order) {
                   1376:                 push(@fields,$field_name);
1.184     banghart 1377:                 $lt{$field_name} = $$added_metadata_fields{$field_name};
                   1378: 	    }
                   1379: 	} else {
1.185     albertel 1380:             foreach my $field_name (keys(%$added_metadata_fields)) {
                   1381:                 push(@fields,$field_name);
1.184     banghart 1382:                 $lt{$field_name} = $$added_metadata_fields{$field_name};
                   1383:             }
1.176     banghart 1384:         }
1.233   ! bisitz   1385:         $output .= &Apache::lonhtmlcommon::start_pick_box();
        !          1386:         my $last = $#fields + 1;
        !          1387:         my $rowcount = 0;
1.143     albertel 1388:         foreach my $field_name (@fields) {
1.233   ! bisitz   1389:             $rowcount++;
1.132     banghart 1390:             if (defined($env{'form.new_'.$field_name})) {
1.201     raeburn  1391:                 my @values = &Apache::loncommon::get_env_multiple('form.new_'.$field_name);
                   1392:                 my $newvalue = '';
                   1393:                 foreach my $item (@values) {
                   1394:                     if ($item ne '') {
                   1395:                         $newvalue .= $item.',';
                   1396:                     }
                   1397:                 }
                   1398:                 $newvalue =~ s/,$//; 
                   1399:                 $Apache::lonpublisher::metadatafields{$field_name}=$newvalue;
1.66      matthew  1400:             }
1.150     albertel 1401:             if ($Apache::lonpublisher::metadatafields{'courserestricted'} ne 'none'
                   1402: 		&& exists($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'})) {
1.115     banghart 1403:                 # handle restrictions here
1.181     banghart 1404:                 if ((($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'} =~ m/active/) ||
                   1405:                     ($field_name eq 'courserestricted'))&&
                   1406:                     (!($env{$Apache::lonpublisher::metadatafields{'courserestricted'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/))){
1.187     banghart 1407:                     
1.233   ! bisitz   1408:                     $output .= &Apache::lonhtmlcommon::row_title($lt{$field_name})
        !          1409:                               .&prettyinput($field_name,
1.132     banghart 1410: 				   $Apache::lonpublisher::metadatafields{$field_name},
1.138     banghart 1411: 				                    'new_'.$field_name,'defaultmeta',
                   1412: 				                    undef,undef,undef,undef,
1.233   ! bisitz   1413:                                                     $Apache::lonpublisher::metadatafields{'courserestricted'});
        !          1414:                     $output .= &Apache::lonhtmlcommon::row_closure($rowcount == $last?1:0);
1.127     banghart 1415:                  }
1.115     banghart 1416:             } else {
1.138     banghart 1417: 
1.233   ! bisitz   1418:                     $output .= &Apache::lonhtmlcommon::row_title($lt{$field_name})
        !          1419:                               .&prettyinput($field_name,
1.185     albertel 1420: 					   $Apache::lonpublisher::metadatafields{$field_name},
1.233   ! bisitz   1421:                                            'new_'.$field_name,'defaultmeta')
        !          1422:                               .&Apache::lonhtmlcommon::row_closure($rowcount == $last?1:0);
1.138     banghart 1423:                
1.115     banghart 1424:             }
1.66      matthew  1425:         }
1.233   ! bisitz   1426:         $output .= &Apache::lonhtmlcommon::end_pick_box();
1.143     albertel 1427: 	if ($env{'form.store'}) {
1.200     raeburn  1428:             my ($outcome,$result) = &store_metadata($fn,$uri,'store');
                   1429:             $r->print($result);
1.142     albertel 1430: 	}
1.233   ! bisitz   1431:         my $savebutton = '<p><input type="submit" name="store"'
        !          1432:                         .' value="'.&mt('Save').'" title="'.&mt('Save Metadata').'" /></p>';
        !          1433:         $r->print($savebutton.$output.$savebutton);
1.147     albertel 1434: 
1.191     raeburn  1435: 	if ($file_type eq 'portfolio' || $file_type eq 'groups') {
1.156     albertel 1436: 	    my ($port_path,$group) = &get_port_path_and_group($uri);
1.191     raeburn  1437:             if ($group ne '') {
1.159     raeburn  1438:                 $r->print('<input type="hidden" name="group" value="'.$group.'" />');
                   1439:             }
1.169     banghart 1440:             $r->print('<input type="hidden" name="currentpath" value="'.$env{'form.currentpath'}.'" />');
1.175     banghart 1441: 	    $r->print('</form><br /><br /><form method="post" action="'.$port_path.'">');
1.191     raeburn  1442: 	    if ($group ne '') {
1.175     banghart 1443: 	        $r->print('<input type="hidden" name="group" value="'.$group.'" />');
1.191     raeburn  1444:             }
1.175     banghart 1445: 	    $r->print('<input type="hidden" name="currentpath" value="'.$path.'" />'.
1.169     banghart 1446: 		      '<input type="submit" name="cancel" value="'.&mt('Discard Edits and Return to Portfolio').'" />');
1.149     albertel 1447: 	}
1.142     albertel 1448:     }
1.149     albertel 1449:     
1.143     albertel 1450:     $r->print('</form>');
                   1451: 
1.66      matthew  1452:     return;
1.1       www      1453: }
1.64      matthew  1454: 
1.200     raeburn  1455: sub store_metadata {
                   1456:     my ($fn,$uri,$caller) = @_;
                   1457:     my $mfh;
                   1458:     my $formname='store';
                   1459:     my ($file_content,$output,$outcome);
                   1460:     if (&Apache::loncommon::get_env_multiple('form.new_keywords')) {
                   1461:         $Apache::lonpublisher::metadatafields{'keywords'} =
                   1462:             join (',', &Apache::loncommon::get_env_multiple('form.new_keywords'));
                   1463:             }
                   1464:     foreach my $field (sort(keys(%Apache::lonpublisher::metadatafields))) {
                   1465:         next if ($field =~ /\./);
                   1466:         my $unikey=$field;
                   1467:         $unikey=~/^([A-Za-z_]+)/;
                   1468:         my $tag=$1;
                   1469:         $tag=~tr/A-Z/a-z/;
                   1470:         $file_content.= "\n\<$tag";
                   1471:         foreach my $key (split(/\,/,$Apache::lonpublisher::metadatakeys{$unikey})) {
                   1472:             my $value = $Apache::lonpublisher::metadatafields{$unikey.'.'.$key};
                   1473:             $value=~s/\"/\'\'/g;
                   1474:             $file_content.=' '.$key.'="'.$value.'"' ;
                   1475:         }
                   1476:         $file_content.= '>'.
                   1477:             &HTML::Entities::encode
                   1478:                 ($Apache::lonpublisher::metadatafields{$unikey},'<>&"').
                   1479:                 '</'.$tag.'>';
                   1480:     }
                   1481:     if ($fn =~ m|^$Apache::lonnet::perlvar{'lonDocRoot'}/userfiles|) {
                   1482:         my ($path, $new_fn);
                   1483:         if ($fn =~ m|$match_name/groups/\w+/portfolio/|) {
                   1484:             ($path, $new_fn) = ($fn =~ m|/(groups/\w+/portfolio.*)/([^/]*)$|);
                   1485:         } else {
                   1486:             ($path, $new_fn) = ($fn =~ m|/(portfolio.*)/([^/]*)$|);
                   1487:         }
                   1488:         ($outcome,my $result) = 
                   1489:             &store_portfolio_metadata($formname,$file_content,
                   1490:                                       $path,$new_fn,$uri,$caller);
                   1491:         $output .= $result;
                   1492:     } else {
                   1493:         if (! ($mfh=Apache::File->new('>'.$fn))) {
1.227     bisitz   1494:             $output .= '<p class="LC_error">';
1.200     raeburn  1495:             if ($caller eq 'transfer') {
                   1496:                 $output .= &mt('Could not transfer data in added fields to notes');
                   1497:             } else { 
                   1498:                 $output .= &mt('Could not write metadata');
                   1499:             }
1.227     bisitz   1500:             $output .= ', '.&mt('FAIL').'</p>';
1.200     raeburn  1501:             $outcome = 'fail';
                   1502:         } else {
                   1503:             print $mfh ($file_content);
                   1504:             close($mfh);
                   1505:             &update_metadata_table($uri);
1.233   ! bisitz   1506:             my $confirmtext;
1.200     raeburn  1507:             if ($caller eq 'transfer') {
1.233   ! bisitz   1508:                 $confirmtext = &mt('Transferred data in added fields to notes');
1.200     raeburn  1509:             } else {
1.233   ! bisitz   1510:                 $confirmtext = &mt('Wrote Metadata');
1.200     raeburn  1511:             }
1.233   ! bisitz   1512:             $output .= &Apache::loncommon::confirmwrapper(
        !          1513:                            &Apache::lonhtmlcommon::confirm_success(
        !          1514:                                $confirmtext.' '.&Apache::lonlocal::locallocaltime(time)));
1.200     raeburn  1515:             $outcome = 'ok';
                   1516:         }
                   1517:     }
                   1518:     return ($outcome,$output);
                   1519: }
                   1520: 
                   1521: sub store_transferred_addedfields {
                   1522:     my ($fn,$uri,$transfers) = @_;
                   1523:     foreach my $item (@{$transfers}) {
                   1524:         $Apache::lonpublisher::metadatafields{'notes'} .= 
                   1525:            ' '.$item.' = '.$Apache::lonpublisher::metadatafields{$item};
                   1526:     }
                   1527:     my ($outcome,$output) = &store_metadata($fn,$uri,'transfer');
                   1528:     if ($outcome eq 'ok') {
                   1529:         foreach my $item (@{$transfers}) {
                   1530:             delete($Apache::lonpublisher::metadatafields{$item});
                   1531:         }
                   1532:     }
                   1533: }
                   1534: 
1.159     raeburn  1535: sub store_portfolio_metadata {
1.200     raeburn  1536:     my ($formname,$content,$path,$new_fn,$uri,$caller) = @_;
                   1537:     my ($outcome,$output);
1.159     raeburn  1538:     $env{'form.'.$formname}=$content."\n";
                   1539:     $env{'form.'.$formname.'.filename'}=$new_fn;
                   1540:     my $result =&Apache::lonnet::userfileupload($formname,'',$path);
                   1541:     if ($result =~ /(error|notfound)/) {
1.227     bisitz   1542:         $output = '<p class="LC_error">';
1.200     raeburn  1543:         if ($caller eq 'transfer') {
                   1544:             $output .= 
                   1545:                 &mt('Could not transfer data in added fields to notes'); 
                   1546:         } else {
                   1547:             $output .= &mt('Could not write metadata');
                   1548:         }
1.227     bisitz   1549:         $output .= ', '.&mt('FAIL').'</p>';
1.200     raeburn  1550:         $outcome = 'fail';
1.159     raeburn  1551:     } else {
1.192     raeburn  1552:         &update_metadata_table($uri);
1.227     bisitz   1553:         $output = '<p class="LC_success">';
1.200     raeburn  1554:         if ($caller eq 'transfer') {
                   1555:             $output .= &mt('Transferred data in added fields to notes');
                   1556:         } else {
                   1557:             $output .= &mt('Wrote Metadata');
                   1558:         }
                   1559:         $output .= ' '.&Apache::lonlocal::locallocaltime(time).
1.227     bisitz   1560:                    '</p>';
1.200     raeburn  1561:         $outcome = 'ok';
1.159     raeburn  1562:     }
1.200     raeburn  1563:     return ($outcome,$output);
1.159     raeburn  1564: }
                   1565: 
1.192     raeburn  1566: sub update_metadata_table {
                   1567:     my ($uri) = @_;
1.196     albertel 1568:     my ($type,$udom,$uname,$file_name,$group) =
                   1569: 	&Apache::lonnet::parse_portfolio_url($uri);
1.192     raeburn  1570:     $file_name =~ s/\.meta$//;
                   1571:     my $current_permissions =
                   1572:         &Apache::lonnet::get_portfile_permissions($udom,$uname);
                   1573:     my %access_controls =
                   1574:         &Apache::lonnet::get_access_controls($current_permissions,$group,
1.196     albertel 1575:                                              $file_name);
1.192     raeburn  1576:     my $access_hash = $access_controls{$file_name};
                   1577:     my $available = 0;
                   1578:     if (ref($access_hash) eq 'HASH') {
                   1579:         foreach my $key (keys(%{$access_hash})) {
                   1580:             my ($num,$scope,$end,$start) =
                   1581:                 ($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/);
                   1582:             if ($scope eq 'public' || $scope eq 'guest') {
                   1583:                 $available = 1;
                   1584:                 last;
                   1585:             }
                   1586:         }
                   1587:     }
                   1588:     if ($available) {
                   1589:         my $result =
                   1590:             &Apache::lonnet::update_portfolio_table($uname,$udom,
1.194     raeburn  1591:             $file_name,'portfolio_metadata',$group,'update');
1.192     raeburn  1592:     }
                   1593: }
                   1594: 
                   1595: 
1.1       www      1596: 1;
                   1597: __END__
1.97      banghart 1598: 
1.216     jms      1599: 
                   1600: =head1 NAME
                   1601: 
                   1602: Apache::lonmeta - display meta data
                   1603: 
                   1604: =head1 SYNOPSIS
                   1605: 
                   1606: Handler to display meta data
                   1607: 
                   1608: This is part of the LearningOnline Network with CAPA project
                   1609: described at http://www.lon-capa.org.
                   1610: 
                   1611: =head1 SUBROUTINES
                   1612: 
                   1613: =over
                   1614: 
                   1615: =item &get_dynamic_metadata_from_sql($url) :
                   1616: 
                   1617: Queries sql database for dynamic metdata
                   1618: Returns a hash of hashes, with keys of urls which match $url
                   1619: Returned fields are given below.
                   1620: 
                   1621: Examples:
                   1622: 
                   1623:     %DynamicMetadata = &Apache::lonmeta::get_dynmaic_metadata_from_sql
                   1624:     ('/res/msu/korte/');
                   1625: 
                   1626:     $DynamicMetadata{'/res/msu/korte/example.problem'}->{$field}
                   1627: 
                   1628: =item dynamicmeta()
                   1629: 
                   1630: Fetch and evaluate dynamic metadata
                   1631: 
                   1632: =item access_count()
                   1633: 
                   1634: =item alttag()
                   1635: 
                   1636: Try to make an alt tag if there is none
                   1637: 
                   1638: =item authordisplay()
                   1639: 
                   1640: Author display
                   1641: 
                   1642: =item evalgraph()
                   1643: 
                   1644: Pretty display
                   1645: 
                   1646: =item diffgraph()
                   1647: 
                   1648: =item fieldnames()
                   1649: 
                   1650: =item portfolio_linked_path()
                   1651: 
                   1652: =item get_port_path_and_group()
                   1653: 
                   1654: =item portfolio_display_uri()
                   1655: 
                   1656: =item pre_select_course()
                   1657: 
                   1658: =item select_course()
                   1659: 
                   1660: =item prettyprint()
                   1661: 
                   1662: Pretty printing of metadata field
                   1663: 
                   1664: =item direct()
                   1665: 
                   1666: Pretty input of metadata field
                   1667: 
                   1668: =item selectbox()
                   1669: 
                   1670: =item relatedfield()
                   1671: 
                   1672: =item prettyinput()
                   1673: 
                   1674: =item report_bombs()
                   1675: 
                   1676: =item present_uneditable_metadata()
                   1677: 
                   1678: =item present_editable_metadata()
                   1679: 
                   1680: =item store_metadata()
                   1681: 
                   1682: =item store_transferred_addedfields()
                   1683: 
                   1684: =item store_portfolio_metadata()
                   1685: 
                   1686: =item update_metadata_table()
                   1687: 
                   1688: =back
                   1689: 
                   1690: =cut

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.