--- loncom/interface/lonmeta.pm 2006/11/20 20:58:30 1.189
+++ loncom/interface/lonmeta.pm 2008/12/13 21:10:14 1.221
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Metadata display handler
#
-# $Id: lonmeta.pm,v 1.189 2006/11/20 20:58:30 banghart Exp $
+# $Id: lonmeta.pm,v 1.221 2008/12/13 21:10:14 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -39,31 +39,12 @@ use Apache::lonpublisher;
use Apache::lonlocal;
use Apache::lonmysql;
use Apache::lonmsg;
-use lib '/home/httpd/lib/perl/';
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
-############################################################
-############################################################
-##
-## &get_dynamic_metadata_from_sql($url)
-##
-## Queries sql database for dynamic metdata
-## Returns a hash of hashes, with keys of urls which match $url
-## Returned fields are given below.
-##
-## Examples:
-##
-## %DynamicMetadata = &Apache::lonmeta::get_dynmaic_metadata_from_sql
-## ('/res/msu/korte/');
-##
-## $DynamicMetadata{'/res/msu/korte/example.problem'}->{$field}
-##
-############################################################
-############################################################
sub get_dynamic_metadata_from_sql {
my ($url) = shift();
- my ($authordom,$author)=($url=~m:^/res/(\w+)/(\w+)/:);
+ my ($authordom,$author)=($url=~m{^/res/($match_domain)/($match_username)/});
if (! defined($authordom)) {
$authordom = shift();
}
@@ -112,7 +93,7 @@ sub get_dynamic_metadata_from_sql {
sub dynamicmeta {
my $url=&Apache::lonnet::declutter(shift);
$url=~s/\.meta$//;
- my ($adomain,$aauthor)=($url=~/^(\w+)\/(\w+)\//);
+ my ($adomain,$aauthor)=($url=~/^($match_domain)\/($match_username)\//);
my $regexp=$url;
$regexp=~s/(\W)/\\$1/g;
$regexp='___'.$regexp.'___';
@@ -183,7 +164,7 @@ sub evalgraph {
my $val=int($value*10.+0.5)-10;
my $output='
';
if ($val>=20) {
- $output.='  ';
+ $output.=''.(' ' x2).' ';
} else {
$output.=' '.
' ';
@@ -193,7 +174,7 @@ sub evalgraph {
$output.=' '.
' ';
} else {
- $output.='  ';
+ $output.=''.(' ' x2).' ';
}
$output.=' ('.sprintf("%5.2f",$value).')
';
return $output;
@@ -236,7 +217,7 @@ sub fieldnames {
'lowestgradelevel' => 'Lowest Grade Level',
'highestgradelevel' => 'Highest Grade Level');
- if (! defined($file_type) || $file_type ne 'portfolio') {
+ if ( !defined($file_type) || ($file_type ne 'portfolio' && $file_type ne 'groups') ) {
%fields =
(%fields,
'domain' => 'Domain',
@@ -266,7 +247,7 @@ sub fieldnames {
'correct' => 'Material appears to be correct',
'technical' => 'Resource is technically correct',
'avetries' => 'Average number of tries till solved',
- 'stdno' => 'Total number of students who have worked on this problem',
+ 'stdno' => 'Statistics calculated for number of students',
'difficulty' => 'Degree of difficulty',
'disc' => 'Degree of discrimination',
'dependencies' => 'Resources used by this resource',
@@ -384,7 +365,40 @@ sub select_course {
$Apache::lonpublisher::metadatafields{'courserestricted'};
my $selected = ($current_restriction eq 'none' ? 'selected="selected"'
: '');
-
+ if ($current_restriction =~ /^course\.($match_domain\_$match_courseid)$/) {
+ my $assoc_crs = $1;
+ my $added_metadata_fields = &Apache::lonparmset::get_added_meta_fieldnames($assoc_crs);
+ if (ref($added_metadata_fields) eq 'HASH') {
+ if (keys(%{$added_metadata_fields}) > 0) {
+ my $transfernotes;
+ foreach my $field_name (keys(%{$added_metadata_fields})) {
+ my $value = $Apache::lonpublisher::metadatafields{$field_name};
+ if ($value) {
+ $transfernotes .=
+ &Apache::loncommon::start_data_table_row().
+ ''.
+ $field_name.' '.$value.' '.
+ &Apache::loncommon::end_data_table_row();
+ }
+ }
+ if ($transfernotes ne '') {
+ my %courseinfo = &Apache::lonnet::coursedescription($assoc_crs,{'one_time' => 1});
+ my $assoc_crs_description = $courseinfo{'description'};
+ $output .= &mt('This resource is currently associated with a course ([_1]) which includes added metadata fields specific to the course.',$assoc_crs_description).' '."\n".
+ &mt('You can choose to transfer data from the added fields to the "Notes" field if you are planning to change the course association.').' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ 'Copy to notes? '."\n".
+ 'Field name '."\n".
+ 'Values '."\n".
+ &Apache::loncommon::end_data_table_header_row().
+ $transfernotes.
+ &Apache::loncommon::end_data_table().' ';
+ }
+ }
+ }
+ }
$output .= '';
$output .= ''.
&mt('None').' '.$/;
@@ -449,7 +463,7 @@ sub prettyprint {
($type eq 'owner') ||
($type eq 'modifyinguser') ||
($type eq 'authorspace')) {
- $value=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse;
+ $value=~s/($match_username)(\:|\@)($match_domain)/&authordisplay($1,$3)/gse;
return $value;
}
# Gradelevel
@@ -541,12 +555,13 @@ sub selectbox {
$functionref=\&direct;
}
my $selout='';
- foreach (@idlist) {
- $selout.=''.&{$functionref}($_).' ';
- }
- else {$selout.='>'.&{$functionref}($_).'';}
+ foreach my $id (@idlist) {
+ $selout.=''.&{$functionref}($id).' ';
+ } else {
+ $selout.='>'.&{$functionref}($id).'';
+ }
}
return $selout.' ';
}
@@ -599,9 +614,16 @@ sub prettyinput {
if ($meta_options{$item}) {
push(@cur_values_inst,$item);
} else {
- $cur_values_stu .= $item.',';
+ if ($item ne '') {
+ $cur_values_stu .= $item.',';
+ }
}
}
+ $cur_values_stu =~ s/,$//;
+ my @key_order = sort(keys(%meta_options));
+ unshift(@key_order,'');
+ $meta_options{''} = 'Not specified';
+ $meta_options{'select_form_order'} = \@key_order;
} else {
$cur_values_stu = $value;
}
@@ -609,11 +631,11 @@ sub prettyinput {
return (&select_course());
# return (' ');
}
- my $course = $env{'request.course.id'};
if (($type eq 'keywords') || ($type eq 'subject')
|| ($type eq 'author')||($type eq 'notes')
|| ($type eq 'abstract')|| ($type eq 'title')|| ($type eq 'standards')
- || (exists($env{'course.'.$env{'request.course.id'}.'.metadata.'.$type.'.added'}))) {
+ || (exists($env{$course_key.'.metadata.'.$type.'.added'}))) {
+
if ($values) {
if ($only_one) {
$output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,%meta_options));
@@ -732,14 +754,14 @@ sub handler {
$r->send_http_header;
return OK if $r->header_only;
my ($resdomain,$resuser)=
- (&Apache::lonnet::declutter($uri)=~/^(\w+)\/(\w+)\//);
+ (&Apache::lonnet::declutter($uri)=~/^($match_domain)\/($match_username)\//);
if ($uri=~m:/adm/bombs/(.*)$:) {
$r->print(&Apache::loncommon::start_page('Error Messages'));
# Looking for all bombs?
&report_bombs($r,$uri);
} elsif ($uri=~m|^/editupload/[^/]+/[^/]+/portfolio/|) {
($resdomain,$resuser)=
- (&Apache::lonnet::declutter($uri)=~m|^(\w+)/(\w+)/portfolio|);
+ (&Apache::lonnet::declutter($uri)=~m|^($match_domain)/($match_name)/portfolio|);
$r->print(&Apache::loncommon::start_page('Edit Portfolio File Catalog Information',
undef,
{'domain' => $resdomain,}));
@@ -751,7 +773,6 @@ sub handler {
%Apache::lonpublisher::metadatakeys=();
my $result=&Apache::lonnet::getfile($fn);
&Apache::lonpublisher::metaeval($result);
- &Apache::lonnet::logthis("restricted is: ".$Apache::lonpublisher::metadatafields{'courserestricted'});
if ((!$Apache::lonpublisher::metadatafields{'courserestricted'}) ||
($env{'form.changecourse'} eq 'true')) {
&pre_select_course($r,$uri);
@@ -766,12 +787,14 @@ sub handler {
&present_editable_metadata($r,$uri,'groups');
} elsif ($uri=~m|^/~|) {
# Construction space
- $r->print(&Apache::loncommon::start_page('Edit Catalog nformation',
- undef,
+ $r->print(&Apache::loncommon::start_page('Edit Catalog Information',
+ "\n".'',
{'domain' => $resdomain,}));
&present_editable_metadata($r,$uri);
} else {
- $r->print(&Apache::loncommon::start_page('Catalog Information',
+ $r->print(&Apache::loncommon::start_page('Metadata',
undef,
{'domain' => $resdomain,}));
&present_uneditable_metadata($r,$uri);
@@ -793,24 +816,28 @@ sub report_bombs {
$uri =~ s:/adm/bombs/::;
$uri = &Apache::lonnet::declutter($uri);
$r->print(''.&Apache::lonnet::clutter($uri).' ');
- my ($domain,$author)=($uri=~/^(\w+)\/(\w+)\//);
+ my ($domain,$author)=($uri=~/^($match_domain)\/($match_username)\//);
if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) {
if ($env{'form.clearbombs'}) {
&Apache::lonmsg::clear_author_res_msg($uri);
}
my $clear=&mt('Clear all Messages in Subdirectory');
- $r->print(<print(<
-
+$cancel
+
ENDCLEAR
my %brokenurls =
&Apache::lonmsg::all_url_author_res_msg($author,$domain);
- foreach (sort(keys(%brokenurls))) {
- if ($_=~/^\Q$uri\E/) {
+ foreach my $key (sort(keys(%brokenurls))) {
+ if ($key=~/^\Q$uri\E/) {
$r->print
- (''.$_.' '.
- &Apache::lonmsg::retrieve_author_res_msg($_).
+ (''.$key.' '.
+ &Apache::lonmsg::retrieve_author_res_msg($key).
' ');
}
}
@@ -833,8 +860,8 @@ sub present_uneditable_metadata {
my $uploaded = ($uri =~ m|/uploaded/|);
my %content=();
# Read file
- foreach (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {
- $content{$_}=&Apache::lonnet::metadata($uri,$_);
+ foreach my $key (split(/\,/,&Apache::lonnet::metadata($uri,'keys'))) {
+ $content{$key}=&Apache::lonnet::metadata($uri,$key);
}
# Render Output
# displayed url
@@ -862,9 +889,9 @@ sub present_uneditable_metadata {
my $obsolete=$content{'obsolete'};
my $obsoletewarning='';
if (($obsolete) && ($env{'user.adv'})) {
- $obsoletewarning=''.
+ $obsoletewarning=''.
&mt('This resource has been marked obsolete by the author(s)').
- '
';
+ '';
}
#
my %lt=&fieldnames();
@@ -901,23 +928,22 @@ sub present_uneditable_metadata {
'obsoletereplacement');
}
foreach my $field (@fields) {
- $table.=''.$lt{$field}.
- ' '.
- &prettyprint($field,$content{$field}).' ';
+ $table.=&Apache::lonhtmlcommon::row_title($lt{$field})
+ .&prettyprint($field,$content{$field})
+ .&Apache::lonhtmlcommon::row_closure();
delete($content{$field});
}
#
- $r->print(<$title
-
-$disuri
-$obsoletewarning
-$versiondisplay
-
-
-ENDHEAD
+ $r->print("$title "
+ .''
+ .$disuri.' '
+ .$obsoletewarning
+ .$versiondisplay
+ .'
'
+ .&Apache::lonhtmlcommon::start_pick_box()
+ .$table
+ .&Apache::lonhtmlcommon::end_pick_box()
+ );
if (!$uploaded && $env{'user.adv'}) {
&print_dynamic_metadata($r,$uri,\%content);
}
@@ -944,17 +970,18 @@ sub print_dynamic_metadata {
exists($dynmeta{'goto'}) ||
exists($dynmeta{'course'})) {
$r->print(''.&mt('Access and Usage Statistics').' '.
- '');
- foreach ('count',
- 'sequsage','sequsage_list',
- 'comefrom','comefrom_list',
- 'goto','goto_list',
- 'course','course_list') {
- $r->print(''.$lt{$_}.' '.
- ''.
- &prettyprint($_,$dynmeta{$_})." \n");
+ &Apache::lonhtmlcommon::start_pick_box());
+ foreach my $item ('count',
+ 'sequsage','sequsage_list',
+ 'comefrom','comefrom_list',
+ 'goto','goto_list',
+ 'course','course_list') {
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
+ .&prettyprint($item,$dynmeta{$item})
+ .&Apache::lonhtmlcommon::row_closure()
+ );
}
- $r->print('
');
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
} else {
$r->print(''.&mt('No Access or Usages Statistics are available for this resource.').' ');
}
@@ -969,35 +996,35 @@ sub print_dynamic_metadata {
$r->print(''.
&mt('Overall Assessment Statistical Data').
' '.
- '');
- $r->print(''.$lt{'stdno'}.' '.
- ''.
- &prettyprint('stdno',$dynmeta{'stdno'}).
- ' '." \n");
- foreach ('avetries','difficulty','disc') {
- $r->print(''.$lt{$_}.' '.
- ''.
- &prettyprint($_,sprintf('%5.2f',$dynmeta{$_})).
- ' '." \n");
+ &Apache::lonhtmlcommon::start_pick_box());
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{'stdno'})
+ .&prettyprint('stdno',$dynmeta{'stdno'})
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ foreach my $item ('avetries','difficulty','disc') {
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
+ .&prettyprint($item,sprintf('%5.2f',$dynmeta{$item}))
+ .&Apache::lonhtmlcommon::row_closure()
+ );
}
- $r->print('
');
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
}
if (exists($dynmeta{'stats'})) {
#
# New assessment statistics
$r->print(''.
- &mt('Detailed Assessment Statistical Data').
+ &mt('Recent Detailed Assessment Statistical Data').
' ');
- my $table = ''.
- ''.
- 'Course '.
- 'Section(s) '.
- 'Num Students '.
- 'Mean Tries '.
- 'Degree of Difficulty '.
- 'Degree of Discrimination '.
- 'Time of computation '.
- ' '.$/;
+ my $table=&Apache::loncommon::start_data_table()
+ .&Apache::loncommon::start_data_table_header_row()
+ .''.&mt('Course').' '
+ .''.&mt('Section(s)').' '
+ .''.&mt('Num Students').' '
+ .''.&mt('Mean Tries').' '
+ .''.&mt('Degree of Difficulty').' '
+ .''.&mt('Degree of Discrimination').' '
+ .''.&mt('Time of computation').' '
+ .&Apache::loncommon::end_data_table_header_row().$/;
foreach my $identifier (sort(keys(%{$dynmeta{'stats'}}))) {
my $data = $dynmeta{'stats'}->{$identifier};
my $course = $data->{'course'};
@@ -1008,33 +1035,32 @@ sub print_dynamic_metadata {
&Apache::lonnet::logthis('lookup for '.$course.' failed');
next;
}
- $table .= '';
+ $table .= &Apache::loncommon::start_data_table_row();
$table .=
- ''.$courseinfo{'description'}.' ';
+ ''.$courseinfo{'description'}.' ';
$table .=
''.$data->{'sections'}.' ';
$table .=
''.$data->{'stdno'}.' ';
- foreach ('avetries','difficulty','disc') {
+ foreach my $item ('avetries','difficulty','disc') {
$table .= '';
- if (exists($data->{$_})) {
- $table .= sprintf('%.2f',$data->{$_}).' ';
+ if (exists($data->{$item})) {
+ $table .= sprintf('%.2f',$data->{$item}).' ';
} else {
$table .= '';
}
$table .= ' ';
}
$table .=
- ''.
+ ''.
&Apache::lonlocal::locallocaltime($data->{'timestamp'}).
- ' ';
- $table .=
- ' '.$/;
+ '';
+ $table .= &Apache::loncommon::end_data_table_row().$/;
}
- $table .= '
'.$/;
+ $table .= &Apache::loncommon::end_data_table().$/;
$r->print($table);
} else {
- $r->print('No new dynamic data found.');
+ $r->print(&mt('No new dynamic data found.'));
}
} else {
$r->print(''.
@@ -1050,17 +1076,18 @@ sub print_dynamic_metadata {
exists($dynmeta{'correct'}) ||
exists($dynmeta{'technical'})){
$r->print(''.&mt('Evaluation Data').' '.
- ' ');
- foreach ('clear','depth','helpful','correct','technical') {
- $r->print(''.$lt{$_}.' '.
- ''.
- &prettyprint($_,$dynmeta{$_})." \n");
+ &Apache::lonhtmlcommon::start_pick_box());
+ foreach my $item ('clear','depth','helpful','correct','technical') {
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
+ .&prettyprint($item,$dynmeta{$item})
+ .&Apache::lonhtmlcommon::row_closure()
+ );
}
- $r->print('
');
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
} else {
$r->print(''.&mt('No Evaluation Data is available for this resource.').' ');
}
- $uri=~/^\/res\/(\w+)\/(\w+)\//;
+ $uri=~/^\/res\/($match_domain)\/($match_username)\//;
if ((($env{'user.domain'} eq $1) && ($env{'user.name'} eq $2))
|| ($env{'user.role.ca./'.$1.'/'.$2})) {
if (exists($dynmeta{'comments'})) {
@@ -1084,9 +1111,9 @@ sub print_dynamic_metadata {
# All other stuff
$r->print(''.
&mt('Additional Metadata (non-standard, parameters, exports)').
- ' ');
- foreach (sort(keys(%content))) {
- my $name=$_;
+ '');
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ foreach my $name (sort(keys(%content))) {
if ($name!~/\.display$/) {
my $display=&Apache::lonnet::metadata($uri,
$name.'.display');
@@ -1094,22 +1121,24 @@ sub print_dynamic_metadata {
$display=$name;
};
my $otherinfo='';
- foreach ('name','part','type','default') {
+ foreach my $item ('name','part','type','default') {
if (defined(&Apache::lonnet::metadata($uri,
- $name.'.'.$_))) {
- $otherinfo.=' '.$_.'='.
+ $name.'.'.$item))) {
+ $otherinfo.=' '.$item.'='.
&Apache::lonnet::metadata($uri,
- $name.'.'.$_).'; ';
+ $name.'.'.$item).'; ';
}
}
- $r->print(''.$display.' '.$content{$name});
+ $r->print(&Apache::lonhtmlcommon::row_title($display)
+ .$content{$name}
+ );
if ($otherinfo) {
$r->print(' ('.$otherinfo.')');
}
- $r->print(" \n");
+ $r->print(&Apache::lonhtmlcommon::row_closure());
}
}
- $r->print("
");
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
return;
}
@@ -1172,17 +1201,20 @@ ENDBOMBS
ENDDEL
} else {
- $r->print(' '.$goback.'');
+ $r->print(''.$goback.'
');
+ if ($env{'form.clearmsg'}) {
+ my ($diruri) = ($disuri =~ m{(.*/)[^/]*});
+ $r->print(''.
+ &mt('Back To Directory').'
');
+ }
}
$r->print(' '.$bombs);
} else {
- my $displayfile='Catalog Information for '.$disuri;
+ my $displayfile=&mt('Metadata for [_1]',$disuri);
if ($disuri=~/\/default$/) {
my $dir=$disuri;
$dir=~s/default$//;
- $displayfile=
- &mt('Default Cataloging Information for Directory').' '.
- $dir;
+ $displayfile=&mt('Default Metadata for Directory [_1]',$dir);
}
%Apache::lonpublisher::metadatafields=();
%Apache::lonpublisher::metadatakeys=();
@@ -1192,18 +1224,43 @@ ENDDEL
} else {
&Apache::lonpublisher::metaeval($result);
}
+ if ($env{'form.new_courserestricted'}) {
+ my $new_assoc_course = $env{'form.new_courserestricted'};
+ my $prev_courserestricted = $Apache::lonpublisher::metadatafields{'courserestricted'};
+ if (($prev_courserestricted) &&
+ ($prev_courserestricted ne $new_assoc_course)) {
+ my $transfers = [];
+ foreach my $key (keys(%env)) {
+ if ($key =~ /^form\.transfer_(.+)$/) {
+ push(@{$transfers},$1);
+ }
+ }
+ if (@{$transfers} > 0) {
+ &store_transferred_addedfields($fn,$uri,$transfers);
+ }
+ }
+ }
$r->print(<$displayfile