--- loncom/interface/lonmeta.pm 2005/08/02 17:01:20 1.101
+++ loncom/interface/lonmeta.pm 2009/05/28 17:08:32 1.235
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Metadata display handler
#
-# $Id: lonmeta.pm,v 1.101 2005/08/02 17:01:20 banghart Exp $
+# $Id: lonmeta.pm,v 1.235 2009/05/28 17:08:32 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',
- '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;
@@ -243,16 +210,17 @@ sub fieldnames {
'authorspace' => 'Author Space',
'modifyinguser' => 'Last Modifying User',
'subject' => 'Subject',
+ 'standards' => 'Standards',
'keywords' => 'Keyword(s)',
'notes' => 'Notes',
'abstract' => 'Abstract',
'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',
- 'standards' => 'Standards',
'mime' => 'MIME Type',
'language' => 'Language',
'creationdate' => 'Creation Date',
@@ -279,38 +247,180 @@ 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',
+ 'dependencies' => 'Resources used by this resource',
);
}
return &Apache::lonlocal::texthash(%fields);
}
-sub select_course {
- my ($r)=@_;
- $r->print('Instructor Selected Meta-Data ');
- $r->print('');
- return 'ok';
+ $output .= '';
+ $output .= ''.
+ &mt('None').' '.$/;
+ my %courses;
+ foreach my $key (keys(%env)) {
+ if ($key !~ m/^course\.(.+)\.description$/) { next; }
+ my $cid = $1;
+ if ($env{$key} !~ /\S/) { next; }
+ $courses{$key} = $cid;
+ }
+ foreach my $key (sort { lc($env{$a}) cmp lc($env{$b}) } (keys(%courses))) {
+ my $cid = 'course.'.$courses{$key};
+ my $selected = ($current_restriction eq $cid ? 'selected="selected"'
+ : '');
+ if ($env{$key} !~ /\S/) { next; }
+ $output .= '';
+ $output .= $env{$key};
+ $output .= ' '.$/;
+ $selected = '';
+ }
+ $output .= ' ';
+ return ($output);
}
# Pretty printing of metadata field
@@ -322,7 +432,7 @@ sub prettyprint {
}
# Title
if ($type eq 'title') {
- return ''.$value.' ';
+ return $value;
}
# Dates
if (($type eq 'creationdate') ||
@@ -353,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
@@ -372,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';
@@ -390,9 +500,9 @@ sub prettyprint {
}
}
$_ = ''.$title.' '.
- &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'-1',$noformat).
+ &Apache::lonhtmlcommon::crumbs($url,$target,$prefix,$form,'0',$noformat).
' '
- } split(/\s*\,\s*/,$value)).' ';
+ } split(/\s*\,\s*/,$value)).' ';
}
# Evaluations
if (($type eq 'clear') ||
@@ -409,18 +519,26 @@ 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);
+ my %courseinfo =
+ &Apache::lonnet::coursedescription($course,
+ {'one_time' => 1});
if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') {
next;
}
- if ($Str ne '') { $Str .= ' '; }
- $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;
@@ -437,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.' ';
}
@@ -459,15 +578,86 @@ sub relatedfield {
return $relatedsep.' ';
}
return $relatedsep.' ';
+ ($relatedvalue?' checked="checked"':'').' />';
}
sub prettyinput {
my ($type,$value,$fieldname,$formname,
- $relatedsearchflag,$relatedsep,$relatedvalue,$size)=@_;
+ $relatedsearchflag,$relatedsep,$relatedvalue,$size,$course_key)=@_;
if (! defined($size)) {
$size = 80;
}
+ my $output;
+ if (defined($course_key)
+ && exists($env{$course_key.'.metadata.'.$type.'.options'})) {
+ my $stu_add;
+ my $only_one;
+ my %meta_options;
+ my @cur_values_inst;
+ my $cur_values_stu;
+ my $values = $env{$course_key.'.metadata.'.$type.'.values'};
+ if ($env{$course_key.'.metadata.'.$type.'.options'} =~ m/stuadd/) {
+ $stu_add = 'true';
+ }
+ if ($env{$course_key.'.metadata.'.$type.'.options'} =~ m/onlyone/) {
+ $only_one = 'true';
+ }
+ # need to take instructor values out of list where instructor and student
+ # values may be mixed.
+ if ($values) {
+ foreach my $item (split(/,/,$values)) {
+ $item =~ s/^\s+//;
+ $meta_options{$item} = $item;
+ }
+ foreach my $item (split(/,/,$value)) {
+ $item =~ s/^\s+//;
+ if ($meta_options{$item}) {
+ push(@cur_values_inst,$item);
+ } else {
+ 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;
+ }
+ if ($type eq 'courserestricted') {
+ return (&select_course());
+ # return (' ');
+ }
+ 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_key.'.metadata.'.$type.'.added'}))) {
+
+ if ($values) {
+ if ($only_one) {
+ $output .= (&Apache::loncommon::select_form($cur_values_inst[0],'new_'.$type,%meta_options));
+ } else {
+ $output .= (&Apache::loncommon::multiple_select_form('new_'.$type,\@cur_values_inst,undef,\%meta_options));
+ }
+ }
+ if ($stu_add) {
+ $output .= ' '.
+ &relatedfield(1,$relatedsearchflag,$relatedsep,$fieldname,
+ $relatedvalue);
+ }
+ return ($output);
+ }
+ if (($type eq 'lowestgradelevel') ||
+ ($type eq 'highestgradelevel')) {
+ return &Apache::loncommon::select_level_form($value,$fieldname).
+ &relatedfield(0,$relatedsearchflag,$relatedsep);
+ }
+ return();
+ }
# Language
if ($type eq 'language') {
return &selectbox($fieldname,
@@ -501,7 +691,7 @@ sub prettyinput {
# Obsolete
if ($type eq 'obsolete') {
return ' '.
+ ($value?' checked="checked"':'').' />'.
&relatedfield(0,$relatedsearchflag,$relatedsep);
}
# Obsolete replacement file
@@ -528,6 +718,11 @@ sub prettyinput {
",'rights')\">".&mt('Select').''.
&relatedfield(0,$relatedsearchflag,$relatedsep);
}
+ if ($type eq 'courserestricted') {
+ return (&select_course());
+ #return (' ');
+ }
+
# Dates
if (($type eq 'creationdate') ||
($type eq 'lastrevisiondate')) {
@@ -547,44 +742,104 @@ sub prettyinput {
$relatedvalue);
}
+# Create pageheader
+sub pageheader {
+ return &Apache::lonhtmlcommon::breadcrumbs()
+ .&Apache::loncommon::head_subbox(
+ &Apache::loncommon::CSTR_pageheader());
+}
+
# 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+)\//);
- my $html=&Apache::lonxml::xmlbegin();
- $r->print($html.''.
- 'Catalog Information'.
- ' ');
+ (&Apache::lonnet::declutter($uri)=~/^($match_domain)\/($match_username)\//);
+
+ # Breadcrumbs
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Construction Space',
+ 'href' => &Apache::loncommon::authorspace(),
+ });
+
if ($uri=~m:/adm/bombs/(.*)$:) {
- $r->print(&Apache::loncommon::bodytag('Error Messages'));
+ &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\//) {
- $r->print(&Apache::loncommon::bodytag
- ('Edit Portfolio File Information','','','',$resdomain));
- &present_editable_metadata($r,$uri,'portfolio');
- &select_course($r);
-
- } elsif ($uri=~/^\/\~/) {
+ } elsif ($uri=~m|^/editupload/[^/]+/[^/]+/portfolio/|) {
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Edit Portfolio File Metadata',
+ 'href' => '',
+ });
+ ($resdomain,$resuser)=
+ (&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 {
+ 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=~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|^/~|) {
# Construction space
- $r->print(&Apache::loncommon::bodytag
- ('Edit Catalog Information','','','',$resdomain));
+ &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::bodytag
- ('Catalog Information','','','',$resdomain));
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Metadata',
+ 'href' => '',
+ });
+ $r->print(&Apache::loncommon::start_page('Metadata',
+ undef,
+ {'domain' => $resdomain,}));
+ $r->print(&pageheader());
&present_uneditable_metadata($r,$uri);
}
- $r->print('