--- loncom/interface/lonmeta.pm 2004/04/14 16:14:29 1.67
+++ loncom/interface/lonmeta.pm 2005/11/08 03:08:15 1.124
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Metadata display handler
#
-# $Id: lonmeta.pm,v 1.67 2004/04/14 16:14:29 matthew Exp $
+# $Id: lonmeta.pm,v 1.124 2005/11/08 03:08:15 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -17,7 +17,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
-# You should have received a copy of the GNU General Public License
+# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
@@ -31,9 +31,9 @@ package Apache::lonmeta;
use strict;
use LONCAPA::lonmetadata();
use Apache::Constants qw(:common);
-use Apache::lonnet();
+use Apache::lonnet;
use Apache::loncommon();
-use Apache::lonhtmlcommon();
+use Apache::lonhtmlcommon();
use Apache::lonmsg;
use Apache::lonpublisher;
use Apache::lonlocal;
@@ -41,6 +41,87 @@ use Apache::lonmysql;
use Apache::lonmsg;
+############################################################
+############################################################
+##
+## &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+)/:);
+ if (! defined($authordom)) {
+ $authordom = shift();
+ }
+ if (! defined($author)) {
+ $author = shift();
+ }
+ 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 $server = &Apache::lonnet::homeserver($author,$authordom);
+ my $reply = &Apache::lonnet::metadata_query($query,undef,undef,
+ ,[$server]);
+ return () if (! defined($reply) || ref($reply) ne 'HASH');
+ my $filename = $reply->{$server};
+ if (! defined($filename) || $filename =~ /^error/) {
+ return ();
+ }
+ my $max_time = time + 10; # wait 10 seconds for results at most
+ my %ReturnHash;
+ #
+ # Look for results
+ my $finished = 0;
+ while (! $finished && time < $max_time) {
+ my $datafile=$Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/'.$filename;
+ if (! -e "$datafile.end") { next; }
+ my $fh;
+ if (!($fh=Apache::File->new($datafile))) { next; }
+ 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];
+ }
+ }
+ $finished = 1;
+ }
+ #
+ return %ReturnHash;
+}
+
+
# Fetch and evaluate dynamic metadata
sub dynamicmeta {
my $url=&Apache::lonnet::declutter(shift);
@@ -114,21 +195,21 @@ sub evalgraph {
return '';
}
my $val=int($value*10.+0.5)-10;
- my $output='
'.$lt{$_}.
@@ -532,80 +772,181 @@ sub present_uneditable_metadata {
}
#
$r->print(<$content{'title'}
-$disuri
+$title
+
+$disuri
$obsoletewarning
-$versiondisplay
-
+$versiondisplay
+
+
ENDHEAD
- if ($ENV{'user.adv'}) {
- &print_dynamic_metadata($r,$uri);
+ if ($env{'user.adv'}) {
+ &print_dynamic_metadata($r,$uri,\%content);
}
return;
}
sub print_dynamic_metadata {
- my ($r,$uri) = @_;
+ my ($r,$uri,$content) = @_;
+ #
+ my %content = %$content;
+ my %lt=&fieldnames();
#
my $description = 'Dynamic Metadata (updated periodically)';
$r->print(''.&mt($description).''.
- &mt('Processing').' ... ');
+ &mt('Processing'));
$r->rflush();
my %items=&fieldnames();
my %dynmeta=&dynamicmeta($uri);
#
# General Access and Usage Statistics
- $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");
+ 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(' ');
+ } else {
+ $r->print(''.&mt('No Access or Usages Statistics are available for this resource.').'');
}
- $r->print(' ');
+ #
+ # Assessment statistics
if ($uri=~/\.(problem|exam|quiz|assess|survey|form)$/) {
- # This is an assessment, print assessment data
- $r->print(
- ''.&mt('Assessment Statistical Data').''.
- '');
- foreach ('stdno','avetries','difficulty') {
+ if (exists($dynmeta{'stdno'}) ||
+ exists($dynmeta{'avetries'}) ||
+ exists($dynmeta{'difficulty'}) ||
+ exists($dynmeta{'disc'})) {
+ # This is an assessment, print assessment data
+ $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");
+ }
+ $r->print(' ');
+ }
+ 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 | '.
+ ' '.$/;
+ foreach my $identifier (sort(keys(%{$dynmeta{'stats'}}))) {
+ my $data = $dynmeta{'stats'}->{$identifier};
+ my $course = $data->{'course'};
+ my %courseinfo = &Apache::lonnet::coursedescription($course);
+ if (! exists($courseinfo{'num'}) || $courseinfo{'num'} eq '') {
+ &Apache::lonnet::logthis('lookup for '.$course.' failed');
+ next;
+ }
+ $table .= '';
+ $table .=
+ ''.$courseinfo{'description'}.' | ';
+ $table .=
+ ''.$data->{'sections'}.' | ';
+ $table .=
+ ''.$data->{'stdno'}.' | ';
+ foreach ('avetries','difficulty','disc') {
+ $table .= '';
+ if (exists($data->{$_})) {
+ $table .= sprintf('%.2f',$data->{$_}).' ';
+ } else {
+ $table .= '';
+ }
+ $table .= ' | ';
+ }
+ $table .=
+ ''.
+ &Apache::lonlocal::locallocaltime($data->{'timestamp'}).
+ ' | ';
+ $table .=
+ ' '.$/;
+ }
+ $table .= ' '.$/;
+ $r->print($table);
+ } else {
+ $r->print('No new dynamic data found.');
+ }
+ } else {
+ $r->print(''.
+ &mt('No Assessment Statistical Data is available for this resource').
+ '');
+ }
+
+ #
+ #
+ 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(' ');
- }
-
- $r->print(''.&mt('Evaluation Data').''.
- '');
- foreach ('clear','depth','helpful','correct','technical') {
- $r->print(''.$lt{$_}.' | '.
- ''.
- &prettyprint($_,$dynmeta{$_})." | \n");
+ $r->print(' ');
+ } else {
+ $r->print(''.&mt('No Evaluation Data is available for this resource.').'');
}
- $r->print(' ');
$uri=~/^\/res\/(\w+)\/(\w+)\//;
- 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').
- ')'.
- ''.$dynmeta{'comments'}.' ');
- $r->print(''.&mt('Error Messages').' ('.
- &mt('visible to author and co-authors only').')'.
- ''.
- &Apache::lonmsg::retrieve_author_res_msg($uri));
+ if ((($env{'user.domain'} eq $1) && ($env{'user.name'} eq $2))
+ || ($env{'user.role.ca./'.$1.'/'.$2})) {
+ if (exists($dynmeta{'comments'})) {
+ $r->print(''.&mt('Evaluation Comments').' ('.
+ &mt('visible to author and co-authors only').
+ ')'.
+ ''.$dynmeta{'comments'}.' ');
+ } else {
+ $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.').'');
+ }
}
+ #
# All other stuff
$r->print(''.
&mt('Additional Metadata (non-standard, parameters, exports)').
- '');
+ '');
foreach (sort(keys(%content))) {
my $name=$_;
if ($name!~/\.display$/) {
@@ -623,16 +964,19 @@ sub print_dynamic_metadata {
$name.'.'.$_).'; ';
}
}
- $r->print(''.$display.': '.$content{$name});
+ $r->print(''.$display.' | '.$content{$name});
if ($otherinfo) {
$r->print(' ('.$otherinfo.')');
}
- $r->print(" \n");
+ $r->print(" | \n");
}
}
+ $r->print(" ");
return;
}
+
+
#####################################################
#####################################################
### ###
@@ -641,32 +985,54 @@ sub print_dynamic_metadata {
#####################################################
#####################################################
sub present_editable_metadata {
- my ($r,$uri) = @_;
+ my ($r,$uri, $file_type) = @_;
# Construction Space Call
# Header
my $disuri=$uri;
my $fn=&Apache::lonnet::filelocation('',$uri);
$disuri=~s/^\/\~/\/priv\//;
$disuri=~s/\.meta$//;
+ $disuri=~s|^/editupload||;
my $target=$uri;
- $target=~s/^\/\~/\/res\/$ENV{'request.role.domain'}\//;
+ $target=~s/^\/\~/\/res\/$env{'request.role.domain'}\//;
$target=~s/\.meta$//;
my $bombs=&Apache::lonmsg::retrieve_author_res_msg($target);
if ($bombs) {
- if ($ENV{'form.delmsg'}) {
+ my $showdel=1;
+ if ($env{'form.delmsg'}) {
if (&Apache::lonmsg::del_url_author_res_msg($target) eq 'ok') {
$bombs=&mt('Messages deleted.');
+ $showdel=0;
} else {
$bombs=&mt('Error deleting messages');
}
}
- my $del=&mt('Delete Messages');
+ 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;
+ } else {
+ $bombs=&mt('Error clearing messages');
+ }
+ }
+ 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
|