--- loncom/interface/lonmeta.pm 2006/05/20 06:40:53 1.156
+++ loncom/interface/lonmeta.pm 2012/05/21 19:01:12 1.246
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Metadata display handler
#
-# $Id: lonmeta.pm,v 1.156 2006/05/20 06:40:53 albertel Exp $
+# $Id: lonmeta.pm,v 1.246 2012/05/21 19:01:12 bisitz Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -39,29 +39,12 @@ use Apache::lonpublisher;
use Apache::lonlocal;
use Apache::lonmysql;
use Apache::lonmsg;
+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();
}
@@ -71,20 +54,7 @@ sub get_dynamic_metadata_from_sql {
if (! defined($authordom) || ! defined($author)) {
return ();
}
- my @Fields = ('url','count','course','course_list',
- 'goto','goto_list',
- 'comefrom','comefrom_list',
- 'sequsage','sequsage_list',
- 'stdno','stdno_list',
- 'dependencies',
- 'avetries','avetries_list',
- 'difficulty','difficulty_list',
- 'disc','disc_list',
- 'clear','technical','correct',
- 'helpful','depth');
- #
- my $query = 'SELECT '.join(',',@Fields).
- ' FROM metadata WHERE url LIKE "'.$url.'%"';
+ my $query = 'SELECT * FROM metadata WHERE url LIKE "'.$url.'%"';
my $server = &Apache::lonnet::homeserver($author,$authordom);
my $reply = &Apache::lonnet::metadata_query($query,undef,undef,
,[$server]);
@@ -106,13 +76,10 @@ sub get_dynamic_metadata_from_sql {
while (my $result = <$fh>) {
chomp($result);
next if (! $result);
- my @Data =
- map {
- &Apache::lonnet::unescape($_);
- } split(',',$result);
- my $url = $Data[0];
- for (my $i=0;$i<=$#Fields;$i++) {
- $ReturnHash{$url}->{$Fields[$i]}=$Data[$i];
+ my %hash=&LONCAPA::lonmetadata::metadata_col_to_hash('metadata',
+ map { &unescape($_) } split(/\,/,$result));
+ foreach my $key (keys(%hash)) {
+ $ReturnHash{$hash{'url'}}->{$key}=$hash{$key};
}
}
$finished = 1;
@@ -126,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.'___';
@@ -185,7 +152,7 @@ sub authordisplay {
my ($aname,$adom)=@_;
return &Apache::loncommon::aboutmewrapper
(&Apache::loncommon::plainname($aname,$adom),
- $aname,$adom,'preview').' ['.$aname.'@'.$adom.'] ';
+ $aname,$adom,'preview').' ['.$aname.':'.$adom.'] ';
}
# Pretty display
@@ -197,7 +164,7 @@ sub evalgraph {
my $val=int($value*10.+0.5)-10;
my $output='
';
if ($val>=20) {
- $output.='  ';
+ $output.=''.(' ' x2).' ';
} else {
$output.=' '.
' ';
@@ -207,7 +174,7 @@ sub evalgraph {
$output.=' '.
' ';
} else {
- $output.='  ';
+ $output.=''.(' ' x2).' ';
}
$output.=' ('.sprintf("%5.2f",$value).')
';
return $output;
@@ -250,13 +217,7 @@ sub fieldnames {
'lowestgradelevel' => 'Lowest Grade Level',
'highestgradelevel' => 'Highest Grade Level');
- if (! defined($file_type) || $file_type ne 'portfolio') {
- %fields =
- (%fields,
- 'courserestricted' => 'Course Restricting Metadata');
- }
-
- if (! defined($file_type) || $file_type ne 'portfolio') {
+ if ( !defined($file_type) || ($file_type ne 'portfolio' && $file_type ne 'groups') ) {
%fields =
(%fields,
'domain' => 'Domain',
@@ -286,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',
@@ -302,17 +263,22 @@ sub portfolio_linked_path {
if ($group) {
$start = "groups/$group/".$start;
}
- my $result = &Apache::portfolio::make_anchor($port_path,$start,'/',
- undef,undef,undef,$group);
-
+ my %anchor_fields = (
+ 'selectfile' => $start,
+ 'currentpath' => '/'
+ );
+ my $result = &Apache::portfolio::make_anchor($port_path,\%anchor_fields,$start);
my $fullpath = '/';
my (undef,@tree) = split('/',$path);
my $filename = pop(@tree);
foreach my $dir (@tree) {
$fullpath .= $dir.'/';
$result .= '/';
- $result .= &Apache::portfolio::make_anchor($port_path,$dir,$fullpath,
- undef,undef,undef,$group);
+ my %anchor_fields = (
+ 'selectfile' => $dir,
+ 'currentpath' => $fullpath
+ );
+ $result .= &Apache::portfolio::make_anchor($port_path,\%anchor_fields,$dir);
}
$result .= "/$filename";
return $result;
@@ -331,6 +297,9 @@ sub get_port_path_and_group {
} else {
$port_path = '/adm/portfolio';
}
+ if ($env{'form.group'} ne $group) {
+ $env{'form.group'} = $group;
+ }
return ($port_path,$group);
}
@@ -369,17 +338,23 @@ sub pre_select_course {
&Apache::lonpublisher::metaeval($result);
}
$r->print(' ');
my ($port_path,$group) = &get_port_path_and_group($uri);
- $r->print(' ');
return;
@@ -390,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').' '.$/;
@@ -417,14 +425,14 @@ sub select_course {
# Pretty printing of metadata field
sub prettyprint {
- my ($type,$value,$target,$prefix,$form,$noformat)=@_;
+ my ($type,$value,$target,$prefix,$form)=@_;
# $target,$prefix,$form are optional and for filecrumbs only
if (! defined($value)) {
return ' ';
}
# Title
if ($type eq 'title') {
- return ''.$value.' ';
+ return $value;
}
# Dates
if (($type eq 'creationdate') ||
@@ -455,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
@@ -474,8 +482,8 @@ sub prettyprint {
($type eq 'comefrom_list') ||
($type eq 'sequsage_list') ||
($type eq 'dependencies')) {
- return ''.join("\n",map {
- my $url = &Apache::lonnet::clutter($_);
+ return ''.join("\n",map {
+ my $url = &Apache::lonnet::clutter_with_no_wrapper($_);
my $title = &Apache::lonnet::gettitle($url);
if ($title eq '') {
$title = 'Untitled';
@@ -492,9 +500,9 @@ sub prettyprint {
}
}
$_ = ''.$title.' '.
- &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'-1',$noformat).
- ' '
- } split(/\s*\,\s*/,$value)).' ';
+ &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form).
+ ''
+ } split(/\s*\,\s*/,$value)).'';
}
# Evaluations
if (($type eq 'clear') ||
@@ -511,7 +519,8 @@ sub prettyprint {
# List of courses
if ($type=~/\_list/) {
my @Courses = split(/\s*\,\s*/,$value);
- my $Str='';
+ my $Str='';
+ my %descriptions;
foreach my $course (@Courses) {
my %courseinfo =
&Apache::lonnet::coursedescription($course,
@@ -519,11 +528,17 @@ sub prettyprint {
if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') {
next;
}
- $Str .= ''.
- $courseinfo{'description'}.' ';
+ $courseinfo{'description'}.' ('.$courseinfo{'domain'}.
+ ')';
}
- return $Str.' ';
+ foreach my $course (sort {lc($a) cmp lc($b)} (keys(%descriptions))) {
+ $Str .= $descriptions{$course};
+ }
+
+ return $Str.'';
}
# No pretty print found
return $value;
@@ -540,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.' ';
}
@@ -562,7 +578,7 @@ sub relatedfield {
return $relatedsep.' ';
}
return $relatedsep.' ';
+ ($relatedvalue?' checked="checked"':'').' />';
}
sub prettyinput {
@@ -598,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;
}
@@ -610,10 +633,12 @@ sub prettyinput {
}
if (($type eq 'keywords') || ($type eq 'subject')
|| ($type eq 'author')||($type eq 'notes')
- || ($type eq 'abstract')|| ($type eq 'title')|| ($type eq 'standards')) {
+ || ($type eq 'abstract')|| ($type eq 'title')|| ($type eq 'standards')
+ || (exists($env{$course_key.'.metadata.'.$type.'.added'}))) {
+
if ($values) {
if ($only_one) {
- $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,%meta_options));
+ $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,\%meta_options));
} else {
$output .= (&Apache::loncommon::multiple_select_form('new_'.$type,\@cur_values_inst,undef,\%meta_options));
}
@@ -625,7 +650,7 @@ sub prettyinput {
$relatedvalue);
}
return ($output);
- }
+ }
if (($type eq 'lowestgradelevel') ||
($type eq 'highestgradelevel')) {
return &Apache::loncommon::select_level_form($value,$fieldname).
@@ -666,7 +691,7 @@ sub prettyinput {
# Obsolete
if ($type eq 'obsolete') {
return ' '.
+ ($value?' checked="checked"':'').' />'.
&relatedfield(0,$relatedsearchflag,$relatedsep);
}
# Obsolete replacement file
@@ -717,45 +742,118 @@ sub prettyinput {
$relatedvalue);
}
+# Create pageheader
+sub pageheader {
+ my $output = '';
+ # No CSTR? Include breadcrumbs
+ if ($env{'request.state'} ne 'construct') {
+ # loncommon::bodytag already includes breadcrumbs for CSTR
+ # by calling lonmenu::innerregister
+ $output = &Apache::lonhtmlcommon::breadcrumbs();
+ }
+ # CSTR? Include CSTR header
+ if ($env{'request.state'} eq 'construct') {
+ $output .= &Apache::loncommon::head_subbox(
+ &Apache::loncommon::CSTR_pageheader());
+ }
+ return $output;
+}
+
# Main Handler
sub handler {
my $r=shift;
- #
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['currentpath','changecourse']);
my $uri=$r->uri;
#
# Set document type
&Apache::loncommon::content_type($r,'text/html');
$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)\//);
+
+ # Breadcrumbs
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+
+ if ($env{'request.state'} eq 'construct') {
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Construction Space',
+ 'href' => &Apache::loncommon::authorspace($uri),
+ });
+ }
if ($uri=~m:/adm/bombs/(.*)$:) {
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Error Messages',
+ 'href' => '',
+ });
$r->print(&Apache::loncommon::start_page('Error Messages'));
+ $r->print(&pageheader());
# Looking for all bombs?
&report_bombs($r,$uri);
- } elsif ($uri=~/\/portfolio\//) {
+ } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/portfolio/|) {
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Edit Portfolio File Metadata',
+ 'href' => '',
+ });
($resdomain,$resuser)=
- (&Apache::lonnet::declutter($uri)=~m|^(\w+)/(\w+)/portfolio|);
- $r->print(&Apache::loncommon::start_page('Edit Portfolio File Catalog Information',
+ (&Apache::lonnet::declutter($uri)=~m|^($match_domain)/($match_name)/portfolio|);
+ $r->print(&Apache::loncommon::start_page('Edit Portfolio File Metadata',
undef,
{'domain' => $resdomain,}));
+ $r->print(&pageheader());
if ($env{'form.store'}) {
&present_editable_metadata($r,$uri,'portfolio');
} else {
- &pre_select_course($r,$uri);
+ my $fn=&Apache::lonnet::filelocation('',$uri);
+ %Apache::lonpublisher::metadatafields=();
+ %Apache::lonpublisher::metadatakeys=();
+ my $result=&Apache::lonnet::getfile($fn);
+ &Apache::lonpublisher::metaeval($result);
+ if ((!$Apache::lonpublisher::metadatafields{'courserestricted'}) ||
+ ($env{'form.changecourse'} eq 'true')) {
+ &pre_select_course($r,$uri);
+ } else {
+ &present_editable_metadata($r,$uri,'portfolio');
+ }
}
- } elsif ($uri=~/^\/\~/) {
- # Construction space
- $r->print(&Apache::loncommon::start_page('Edit Catalog nformation',
+ } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/groups/|) {
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Edit Group Portfolio File Metadata',
+ 'href' => '',
+ });
+ $r->print(&Apache::loncommon::start_page('Edit Group Portfolio File Metadata',
undef,
{'domain' => $resdomain,}));
+ $r->print(&pageheader());
+ &present_editable_metadata($r,$uri,'groups');
+ } elsif ($uri=~m|^/priv|) {
+ # Construction space
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Edit Metadata',
+ 'href' => '',
+ });
+ $r->print(&Apache::loncommon::start_page('Edit Metadata',
+ "\n".'',
+ {'domain' => $resdomain,}));
+ $r->print(&pageheader());
&present_editable_metadata($r,$uri);
} else {
- $r->print(&Apache::loncommon::start_page('Catalog Information',
- undef,
- {'domain' => $resdomain,}));
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Metadata',
+ 'href' => '',
+ });
+ $r->print(
+ &Apache::loncommon::start_page(
+ 'Metadata',
+ undef,
+ {'domain' => $resdomain,
+ 'only_body' => 1,})
+ .''.&mt('Metadata').' '
+ );
&present_uneditable_metadata($r,$uri);
}
$r->print(&Apache::loncommon::end_page());
@@ -775,29 +873,62 @@ sub report_bombs {
$uri =~ s:/adm/bombs/::;
$uri = &Apache::lonnet::declutter($uri);
$r->print(''.&Apache::lonnet::clutter($uri).' ');
- my ($domain,$author)=($uri=~/^(\w+)\/(\w+)\//);
- if (&Apache::loncacc::constructaccess('/~'.$author.'/',$domain)) {
- if ($env{'form.clearbombs'}) {
- &Apache::lonmsg::clear_author_res_msg($uri);
- }
- my $clear=&mt('Clear all Messages in Subdirectory');
- $r->print(<
-
-
-ENDCLEAR
+ my ($domain,$author)=($uri=~/^($match_domain)\/($match_username)\//);
+ if (!&Apache::loncacc::constructaccess('/priv/'.$domain.'/'.$author.'/')) {
+ $r->print(''.&mt('Not authorized').'
');
+ return;
+ }
+
+ my $showbuttons=1;
+ my $message='';
+ if ($env{'form.clearbombs'}) {
+ my $rc=&Apache::lonmsg::clear_author_res_msg($uri);
+ if ($rc eq 'ok') {
+ $message=&Apache::lonhtmlcommon::confirm_success(
+ &mt('Messages cleared.'));
+ $showbuttons=0;
+ } else {
+ $message=&Apache::lonhtmlcommon::confirm_success(
+ &mt('Error clearing messages'),1)
+ .' '.&mt('Error: [_1]',$rc);
+ }
+ }
+
+ if ($message) {
+ $message=&Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ }
+
+ my $cancelurl=$uri;
+ $cancelurl=~s/^\Q$domain\E/\/priv\/$domain/;
+
+ if ($showbuttons) {
+ $r->print(
+ ' '
+ );
+ # Display all bombs of subdirectory
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).
' ');
}
}
} else {
- $r->print(&mt('Not authorized'));
+ my $functions=&Apache::lonhtmlcommon::start_funclist('Actions');
+ $functions.=&Apache::lonhtmlcommon::add_item_funclist(
+ ''.
+ &mt('Back to Source Directory').' ');
+ $functions .= &Apache::lonhtmlcommon::end_funclist();
+ $r->print(''.$functions.'
');
}
return;
}
@@ -812,39 +943,40 @@ ENDCLEAR
sub present_uneditable_metadata {
my ($r,$uri) = @_;
#
+ 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
my ($thisversion)=($uri=~/\.(\d+)\.(\w+)\.meta$/);
$uri=~s/\.meta$//;
- my $disuri=&Apache::lonnet::clutter($uri);
- $disuri=~s/^\/adm\/wrapper//;
+ my $disuri=&Apache::lonnet::clutter_with_no_wrapper($uri);
# version
- my $currentversion=&Apache::lonnet::getversion($disuri);
my $versiondisplay='';
- if ($thisversion) {
- $versiondisplay=&mt('Version').': '.$thisversion.
- ' ('.&mt('most recent version').': '.
- ($currentversion>0 ?
- $currentversion :
- &mt('information not available')).')';
- } else {
- $versiondisplay='Version: '.$currentversion;
+ if (!$uploaded) {
+ my $currentversion=&Apache::lonnet::getversion($disuri);
+ if ($thisversion) {
+ $versiondisplay=&mt('Version').': '.$thisversion.
+ ' ('.&mt('most recent version').': '.
+ ($currentversion>0 ?
+ $currentversion :
+ &mt('information not available')).')';
+ } else {
+ $versiondisplay='Version: '.$currentversion;
+ }
}
- # crumbify displayed URL uri target prefix form size
- $disuri=&Apache::lonhtmlcommon::crumbs($disuri,undef, undef, undef,'+1');
- $disuri =~ s: ::g;
+ # crumbify displayed URL uri target prefix form
+ $disuri=&Apache::lonhtmlcommon::crumbs($disuri,undef, undef, undef);
# obsolete
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();
@@ -853,44 +985,55 @@ sub present_uneditable_metadata {
if (! defined($title)) {
$title = 'Untitled Resource';
}
- foreach ('title',
- 'author',
- 'subject',
- 'keywords',
- 'notes',
- 'abstract',
- 'lowestgradelevel',
- 'highestgradelevel',
- 'standards',
- 'mime',
- 'language',
- 'creationdate',
- 'lastrevisiondate',
- 'owner',
- 'copyright',
- 'customdistributionfile',
- 'sourceavail',
- 'sourcerights',
- 'obsolete',
- 'obsoletereplacement') {
- $table.=''.$lt{$_}.
- ' '.
- &prettyprint($_,$content{$_}).' ';
- delete $content{$_};
+ my @fields;
+ if ($uploaded) {
+ @fields = ('title','author','subject','keywords','notes','abstract',
+ 'lowestgradelevel','highestgradelevel','standards','mime',
+ 'owner');
+ } else {
+ @fields = ('title',
+ 'author',
+ 'subject',
+ 'keywords',
+ 'notes',
+ 'abstract',
+ 'lowestgradelevel',
+ 'highestgradelevel',
+ 'standards',
+ 'mime',
+ 'language',
+ 'creationdate',
+ 'lastrevisiondate',
+ 'owner',
+ 'copyright',
+ 'customdistributionfile',
+ 'sourceavail',
+ 'sourcerights',
+ 'obsolete',
+ 'obsoletereplacement');
+ }
+ my $rownum = 0;
+ foreach my $field (@fields) {
+ my $lastrow = '';
+ $rownum ++;
+ $lastrow = 1 if ($rownum == @fields);
+ $table.=&Apache::lonhtmlcommon::row_title($lt{$field})
+ .&prettyprint($field,$content{$field})
+ .&Apache::lonhtmlcommon::row_closure($lastrow);
+ delete($content{$field});
}
#
- $r->print(<$title
-
-$disuri
-$obsoletewarning
-$versiondisplay
-
-
-ENDHEAD
- if ($env{'user.adv'}) {
+ $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);
}
return;
@@ -910,29 +1053,36 @@ sub print_dynamic_metadata {
my %dynmeta=&dynamicmeta($uri);
#
# General Access and Usage Statistics
+ $r->print(''.&mt('Access and Usage Statistics').' ');
if (exists($dynmeta{'count'}) ||
exists($dynmeta{'sequsage'}) ||
exists($dynmeta{'comefrom'}) ||
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");
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ my @counts = ('count','sequsage','sequsage_list',
+ 'comefrom','comefrom_list','goto',
+ 'goto_list','course','course_list');
+ my $rownum = 0;
+ foreach my $item (@counts) {
+ my $lastrow = '';
+ $rownum ++;
+ $lastrow = 1 if ($rownum == @counts);
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
+ .&prettyprint($item,$dynmeta{$item})
+ .&Apache::lonhtmlcommon::row_closure($lastrow)
+ );
}
- $r->print('
');
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
} else {
- $r->print(''.&mt('No Access or Usages Statistics are available for this resource.').' ');
+ $r->print(''
+ .&mt('No Access or Usages Statistics are available for this resource.')
+ .'
'
+ );
}
#
# Assessment statistics
- if ($uri=~/\.(problem|exam|quiz|assess|survey|form)$/) {
+ if ($uri=~/$LONCAPA::assess_re/) {
if (exists($dynmeta{'stdno'}) ||
exists($dynmeta{'avetries'}) ||
exists($dynmeta{'difficulty'}) ||
@@ -941,35 +1091,42 @@ 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()
+ );
+ my @stats = ('avetries','difficulty','disc');
+ my $rownum = 0;
+ foreach my $item (@stats) {
+ my $lastrow = '';
+ $rownum ++;
+ $lastrow = 1 if ($rownum == @stats);
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
+ .&prettyprint($item,sprintf('%5.2f',$dynmeta{$item}))
+ .&Apache::lonhtmlcommon::row_closure($lastrow)
+ );
}
- $r->print('
');
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
}
+ #
+ # New assessment statistics
+ $r->print(''
+ .&mt('Recent Detailed Assessment Statistical Data')
+ .' '
+ );
if (exists($dynmeta{'stats'})) {
- #
- # New assessment statistics
- $r->print(''.
- &mt('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('Part').' '
+ .''.&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'};
@@ -980,33 +1137,37 @@ 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') {
+ $table .=
+ ''.$data->{'part'}.' ';
+ 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(''.
@@ -1015,73 +1176,105 @@ sub print_dynamic_metadata {
}
#
- #
+ # Evaluation Data
+ $r->print(''.&mt('Evaluation Data').' ');
if (exists($dynmeta{'clear'}) ||
exists($dynmeta{'depth'}) ||
exists($dynmeta{'helpful'}) ||
exists($dynmeta{'correct'}) ||
exists($dynmeta{'technical'})){
- $r->print(''.&mt('Evaluation Data').' '.
- ' ');
- foreach ('clear','depth','helpful','correct','technical') {
- $r->print(''.$lt{$_}.' '.
- ''.
- &prettyprint($_,$dynmeta{$_})." \n");
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ my @criteria = ('clear','depth','helpful','correct','technical');
+ my $rownum = 0;
+ foreach my $item (@criteria) {
+ my $lastrow = '';
+ $rownum ++;
+ $lastrow = 1 if ($rownum == @criteria);
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{$item})
+ .&prettyprint($item,$dynmeta{$item})
+ .&Apache::lonhtmlcommon::row_closure($lastrow)
+ );
}
- $r->print('
');
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
} else {
- $r->print(''.&mt('No Evaluation Data is available for this resource.').' ');
+ $r->print(''
+ .&mt('No Evaluation Data is available for this resource.')
+ .'
'
+ );
}
- $uri=~/^\/res\/(\w+)\/(\w+)\//;
+ # Evaluation Comments
+ $uri=~/^\/res\/($match_domain)\/($match_username)\//;
if ((($env{'user.domain'} eq $1) && ($env{'user.name'} eq $2))
|| ($env{'user.role.ca./'.$1.'/'.$2})) {
+ $r->print(''.&mt('Evaluation Comments').' '
+ .'('
+ .&mt('visible to author and co-authors only')
+ .')
'
+ );
if (exists($dynmeta{'comments'})) {
- $r->print(''.&mt('Evaluation Comments').' ('.
- &mt('visible to author and co-authors only').
- ') '.
- ''.$dynmeta{'comments'}.' ');
+ $r->print(''.$dynmeta{'comments'}.' ');
} else {
- $r->print(''.&mt('There are no Evaluation Comments on this resource.').' ');
+ $r->print(''
+ .&mt('There are no Evaluation Comments on this resource.')
+ .'
'
+ );
}
my $bombs = &Apache::lonmsg::retrieve_author_res_msg($uri);
if (defined($bombs) && $bombs ne '') {
- $r->print(''.&mt('Error Messages').' ('.
- &mt('visible to author and co-authors only').')'.
- ' '.$bombs);
- } else {
- $r->print(''.&mt('There are currently no Error Messages for this resource.').' ');
- }
+ $r->print(' '
+ .''.&mt('Error Messages').' '
+ .'('
+ .&mt('visible to author and co-authors only')
+ .')
'
+ .$bombs
+ );
+ } #else {
+ # $r->print(''.&mt('There are currently no Error Messages for this resource.').' ');
+ #}
}
#
# All other stuff
$r->print(''.
&mt('Additional Metadata (non-standard, parameters, exports)').
- ' ');
- foreach (sort(keys(%content))) {
- my $name=$_;
- if ($name!~/\.display$/) {
+ '');
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ my @names;
+ foreach my $key (sort(keys(%content))) {
+ if ($key!~/\.display$/) {
+ push(@names,$key);
+ }
+ }
+ if (@names > 0) {
+ my $rownum = 0;
+ foreach my $name (@names) {
+ my $lastrow = '';
+ $rownum ++;
+ $lastrow = 1 if ($rownum == @names);
+
my $display=&Apache::lonnet::metadata($uri,
$name.'.display');
if (! $display) {
$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($lastrow));
}
}
- $r->print("
");
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
return;
}
@@ -1095,7 +1288,7 @@ sub print_dynamic_metadata {
#####################################################
#####################################################
sub present_editable_metadata {
- my ($r,$uri, $file_type) = @_;
+ my ($r,$uri,$file_type) = @_;
# Construction Space Call
# Header
my $disuri=$uri;
@@ -1112,49 +1305,72 @@ sub present_editable_metadata {
$target=~s/\.meta$//;
my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target);
if ($bombs) {
- my $showdel=1;
+ # Display Bombs, not Metadata
+ $r->print("$disuri ");
+ my $showbuttons=1;
+ my $message='';
+ my $rc='';
if ($env{'form.delmsg'}) {
- if (&Apache::lonmsg::del_url_author_res_msg($target) eq 'ok') {
- $bombs=&mt('Messages deleted.');
- $showdel=0;
+ $rc=&Apache::lonmsg::del_url_author_res_msg($target);
+ if ($rc eq 'ok') {
+ $message=&Apache::lonhtmlcommon::confirm_success(
+ &mt('Messages deleted.'));
+ $showbuttons=0;
} else {
- $bombs=&mt('Error deleting messages');
+ $message=&Apache::lonhtmlcommon::confirm_success(
+ &mt('Error deleting messages'), 1)
+ .' '.&mt('Error: [_1]',$rc);
}
}
if ($env{'form.clearmsg'}) {
my $cleardir=$target;
- $cleardir=~s/\/[^\/]+$/\//;
- if (&Apache::lonmsg::clear_author_res_msg($cleardir) eq 'ok') {
- $bombs=&mt('Messages cleared.');
- $showdel=0;
+ $cleardir=~s/\/[^\/]+$/\//; # Extract dir: keep path, remove filename
+ $rc=&Apache::lonmsg::clear_author_res_msg($cleardir);
+ if ($rc eq 'ok') {
+ $message=&Apache::lonhtmlcommon::confirm_success(
+ &mt('Messages cleared.'));
+ $showbuttons=0;
} else {
- $bombs=&mt('Error clearing messages');
+ $message=&Apache::lonhtmlcommon::confirm_success(
+ &mt('Error clearing messages'),1)
+ .' '.&mt('Error: [_1]',$rc);
}
}
- my $del=&mt('Delete Messages for this Resource');
- my $clear=&mt('Clear all Messages in Subdirectory');
- my $goback=&mt('Back to Source File');
- $r->print(<$disuri
-