[LON-CAPA-cvs] cvs: loncom /interface lonchart.pm
minaeibi
lon-capa-cvs@mail.lon-capa.org
Tue, 19 Feb 2002 18:58:10 -0000
This is a MIME encoded message
--minaeibi1014145090
Content-Type: text/plain
minaeibi Tue Feb 19 13:58:10 2002 EDT
Modified files:
/loncom/interface lonchart.pm
Log:
Added sorting by last name and section
Data cached in the local machine
--minaeibi1014145090
Content-Type: text/plain
Content-Disposition: attachment; filename="minaeibi-20020219135810.txt"
Index: loncom/interface/lonchart.pm
diff -u loncom/interface/lonchart.pm:1.29 loncom/interface/lonchart.pm:1.30
--- loncom/interface/lonchart.pm:1.29 Wed Feb 6 11:59:50 2002
+++ loncom/interface/lonchart.pm Tue Feb 19 13:58:10 2002
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# (Publication Handler
#
-# $Id: lonchart.pm,v 1.29 2002/02/06 16:59:50 minaeibi Exp $
+# $Id: lonchart.pm,v 1.30 2002/02/19 18:58:10 minaeibi Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -43,7 +43,7 @@
# 9/8 Gerd Kortemeyer
# 10/1, 10/19, 11/17, 11/22, 11/24, 11/28 12/18 Behrouz Minaei
# YEAR=2002
-# 2/1 Behrouz Minaei
+# 2/1, 2/6, 2/19 Behrouz Minaei
#
###
@@ -58,9 +58,12 @@
# -------------------------------------------------------------- Module Globals
my %hash;
+my %CachData;
my @cols;
my @rowlabels;
my @students;
+my @PreCol;
+my $r;
# ------------------------------------------------------------- Find out status
@@ -221,183 +224,238 @@
}
}
-# ================================================================ Main Handler
-
-sub handler {
-
- undef %hash;
- undef @students;
- undef @cols;
- undef @rowlabels;
- my $r=shift;
+sub BuildChart {
+# ----------------------- Get first and last resource, see if there is anything
+ my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}};
+ my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}};
+ if (($firstres) && ($lastres)) {
+# ----------------------------------------------------------------- Render page
+ my $cid=$ENV{'request.course.id'};
+ my $chome=$ENV{'course.'.$cid.'.home'};
+ my ($cdom,$cnum)=split(/\_/,$cid);
+# ---------------------------------------------- Read class list and row labels
+ my $classlst=&Apache::lonnet::reply
+ ('dump:'.$cdom.':'.$cnum.':classlist',$chome);
+ my $now=time;
+ unless ($classlst=~/^error\:/) {
+ map {
+ my ($name,$value)=split(/\=/,$_);
+ my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value));
+ my $active=1;
+ if (($end) && ($now>$end)) { $active=0; }
+ if ($active) {
+ my $thisindex=$#students+1;
+ $name=&Apache::lonnet::unescape($name);
+ $students[$thisindex]=$name;
+ my ($sname,$sdom)=split(/\:/,$name);
+ $PreCol[$thisindex]=$sname.':';
+ my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid);
+ if ($ssec==-1) {
+ $rowlabels[$thisindex]=
+ 'Data not available: '.$name;
+ } else {
+ my %reply=&Apache::lonnet::idrget($sdom,$sname);
+ my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname.
+ ':environment:lastname&generation&firstname&middlename',
+ &Apache::lonnet::homeserver($sname,$sdom));
+ #$ssec=(int($ssec)) ? int($ssec) : $ssec;
+ $rowlabels[$thisindex]=
+ sprintf('%3s',$ssec).' '.$reply{$sname}.' ';
+ $PreCol[$thisindex] .= $reply.':'.$ssec;
+ my $i=0;
+ map {
+ $i++;
+ if ( $_ ne '') {
+ $rowlabels[$thisindex].=&Apache::lonnet::unescape($_).' ';
+ }
+ if ($i == 2) {
+ chop($rowlabels[$thisindex]);
+ $rowlabels[$thisindex].=', ';
+ }
+ } split(/\&/,$reply);
+ }
+ }
+ } sort split(/\&/,$classlst);
- if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
-# ------------------------------------------- Set document type for header only
+ } else {
+ $r->print('<h1>Could not access course data</h1>');
+ }
+
+ my $allstudents=$#students+1;
+ $r->print('<h3>'.$allstudents.' students</h3>');
+ &CreateForm();
+ $r->rflush();
- if ($r->header_only) {
- if ($ENV{'browser.mathml'}) {
- $r->content_type('text/xml');
- } else {
- $r->content_type('text/html');
- }
- &Apache::loncommon::no_cache($r);
- $r->send_http_header;
- return OK;
- }
+# --------------- Find all assessments and put them into some linear-like order
+ &tracetable($firstres,'&'.$lastres.'&');
+# ----------------------------------------------------------------- Start table
- my $requrl=$r->uri;
-# ----------------------------------------------------------------- Tie db file
- if ($ENV{'request.course.fn'}) {
- my $fn=$ENV{'request.course.fn'};
- if (-e "$fn.db") {
- if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) {
-# ------------------------------------------------------------------- Hash tied
+ $r->print('<p><pre>');
+ my $index;
+ for ($index=0;$index<=$#students;$index++) {
+ my $Str=&ExtractStudentData($index,$cid);
+ $r->print($Str.'<br>');
+ $r->rflush();
+ $CachData{$PreCol[$index]}=$Str;
+ }
+ $r->print('</pre>');
+ } else {
+ $r->print('<h3>Undefined course sequence</h3>');
+ }
+}
+sub CreateForm {
+ my $Ptr = '<form name=stat method=post action="/adm/chart" >'."\n";
+ $Ptr .= '<b> Sort by: </b>'."\n";
+ $Ptr .= ' ';
+ $Ptr .= '<input type=submit name=sort value="Email Name" />'."\n";
+ $Ptr .= ' ';
+ $Ptr .= '<input type=submit name=sort value="Last Name" />'."\n";
+ $Ptr .= ' ';
+ $Ptr .= '<input type=submit name=sort value="Section"/>'."\n";
+ $Ptr .= '<br>';
+ $Ptr .= '<input type=submit name=sort value="Recalculate Chart"/>'."\n";
+ $Ptr .= '</form>'."\n";
+ $r->print( $Ptr );
+}
-# ------------------------------------------------------------------ Build page
+sub CacheChart {
+ my @list = ();
+ my $count=0;
+
+ my $Pos = $ENV{'form.sort'};
+ if ( $Pos eq 'Last Name' ) {$Pos=1;}
+ elsif ( $Pos eq 'Section' ) {$Pos=2;}
+ else {$Pos=0;}
+
+ foreach my $key( keys %CachData) {
+ my @Temp=split(/\:/,$key);
+ my $Use = $Temp[$Pos];
+ $list[$count]=$Use.$key.'*'.$CachData{$key};
+ $count++;
+ }
-# ---------------------------------------------------------------- Send headers
+ @list = sort (@list);
- $r->content_type('text/html');
- $r->send_http_header;
- $r->print(
- '<html><head><title>LON-CAPA Assessment Chart</title></head>');
-
- $r->print('<body bgcolor="#FFFFFF">'.
- '<script>window.focus();</script>'.
- '<img align=right src=/adm/lonIcons/lonlogos.gif>'.
- '<h1>Assessment Chart</h1>');
+ $r->print('<h3>'.$count.' students</h3>');
+ &CreateForm();
+ $r->rflush();
+
+ $r->print('<p><pre>');
+ for ( my $n; $n < $count; $n++) {
+ my ($dummy, $Line) = split(/\*/,$list[$n]);
+ $r->print($Line.'<br>');
+ }
+ $r->print('</pre>');
+}
+sub Start {
+ undef %hash;
+ undef %CachData;
+ undef @students;
+ undef @cols;
+ undef @rowlabels;
+ undef @PreCol;
+
+ $r->print('<html><head><title>'.
+ 'LON-CAPA Assessment Chart</title></head>');
+ $r->print('<body bgcolor="#FFFFFF">'.
+ '<script>window.focus();</script>'.
+ '<img align=right src=/adm/lonIcons/lonlogos.gif>'.
+ '<h1>Assessment Chart</h1>');
# ---------------------------------------------------------------- Course title
-
- $r->print('<h1>'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1><h3>'.
- localtime()."</h3><p><pre>1..9: correct by student in 1..9 tries\n".
- " *: correct by student in more than 9 tries\n".
- " +: correct by override\n".
- " -: incorrect by override\n".
- " .: incorrect attempted\n".
- " #: ungraded attempted\n".
- " : not attempted\n".
- " x: excused</pre><p>");
-
+ $r->print('<h1>'.$ENV{'course.'.$ENV{'request.course.id'}.
+ '.description'}.'</h1><h3>'.localtime().
+ "</h3><p><pre>1..9: correct by student in 1..9 tries\n".
+ " *: correct by student in more than 9 tries\n".
+ " +: correct by override\n".
+ " -: incorrect by override\n".
+ " .: incorrect attempted\n".
+ " #: ungraded attempted\n".
+ " : not attempted\n".
+ " x: excused</pre><p>");
# ------------------------------- This is going to take a while, produce output
-
- $r->rflush();
-
-# ----------------------- Get first and last resource, see if there is anything
-
-
- my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}};
- my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}};
- if (($firstres) && ($lastres)) {
-# ----------------------------------------------------------------- Render page
-
- my $cid=$ENV{'request.course.id'};
- my $chome=$ENV{'course.'.$cid.'.home'};
- my ($cdom,$cnum)=split(/\_/,$cid);
-
-# ---------------------------------------------- Read class list and row labels
-
- my $classlst=&Apache::lonnet::reply
- ('dump:'.$cdom.':'.$cnum.':classlist',$chome);
- my $now=time;
- unless ($classlst=~/^error\:/) {
- map {
- my ($name,$value)=split(/\=/,$_);
- my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value));
- my $active=1;
- if (($end) && ($now>$end)) { $active=0; }
- if ($active) {
- my $thisindex=$#students+1;
- $name=&Apache::lonnet::unescape($name);
- $students[$thisindex]=$name;
- my ($sname,$sdom)=split(/\:/,$name);
- my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid);
- if ($ssec==-1) {
- $rowlabels[$thisindex]=
- 'Data not available: '.$name;
- } else {
- my %reply=&Apache::lonnet::idrget($sdom,$sname);
- my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname.
- ':environment:lastname&generation&firstname&middlename',
- &Apache::lonnet::homeserver($sname,$sdom));
-
- #$ssec=(int($ssec)) ? int($ssec) : $ssec;
-
- $rowlabels[$thisindex]=
- sprintf('%3s',$ssec).' '.$reply{$sname}.' ';
- my $i=0;
- map {
- $i++;
- if ( $_ ne '') {
- $rowlabels[$thisindex].=&Apache::lonnet::unescape($_).' ';
- }
- if ($i == 2) {
- chop($rowlabels[$thisindex]);
- $rowlabels[$thisindex].=', ';
- }
- } split(/\&/,$reply);
-
- }
- }
- } sort split(/\&/,$classlst);
-
- } else {
- $r->print('<h1>Could not access course data</h1>');
- }
-
- my $allstudents=$#students+1;
- $r->print('<h3>'.$allstudents.' students</h3>');
$r->rflush();
-# --------------- Find all assessments and put them into some linear-like order
-
- &tracetable($firstres,'&'.$lastres.'&');
-
-# ----------------------------------------------------------------- Start table
+ my $cid=$ENV{'request.course.id'};
+ my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".
+ "_$ENV{'user.domain'}_$cid\_chart.db";
+
+ if ((-e "$ChartDB") && ($ENV{'form.sort'} ne 'Recalculate Chart')) {
+ if (tie(%CachData,'GDBM_File',"$ChartDB",&GDBM_READER,0640)) {
+ &CacheChart();
+ }
+ else {
+ $r->print("Unable to tie hash to db file");
+ }
+ }
+ else {
+ if (tie(%CachData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) {
+ foreach (keys %CachData) {delete $CachData{$_};}
+ &BuildChart();
+ }
+ else {
+ $r->print("Unable to tie hash to db file");
+ }
+ }
+ untie(%CachData);
+}
- $r->print('<p><pre>');
- my $index;
- for ($index=0;$index<=$#students;$index++) {
- $r->print(&ExtractStudentData($index,$cid).'<br>');
- $r->rflush();
- }
- $r->print('</pre>');
+# ================================================================ Main Handler
- } else {
- $r->print('<h3>Undefined course sequence</h3>');
- }
+sub handler {
+ $r=shift;
+ if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
+# ------------------------------------------- Set document type for header only
+ if ($r->header_only) {
+ if ($ENV{'browser.mathml'}) {
+ $r->content_type('text/xml');
+ } else {
+ $r->content_type('text/html');
+ }
+ &Apache::loncommon::no_cache($r);
+ $r->send_http_header;
+ return OK;
+ }
- $r->print('</body></html>');
-
+ my $requrl=$r->uri;
+# ----------------------------------------------------------------- Tie db file
+ if ($ENV{'request.course.fn'}) {
+ my $fn=$ENV{'request.course.fn'};
+ if (-e "$fn.db") {
+ if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) {
+# ------------------------------------------------------------------- Hash tied
+# ---------------------------------------------------------------- Send headers
+ $r->content_type('text/html');
+ $r->send_http_header;
+ &Start();
+ $r->print('</body></html>');
# ------------------------------------------------------------- End render page
- } else {
- $r->content_type('text/html');
- $r->send_http_header;
- $r->print('<html><body>Coursemap undefined.</body></html>');
- }
+ } else {
+ $r->content_type('text/html');
+ $r->send_http_header;
+ $r->print('<html><body>Coursemap undefined.</body></html>');
+ }
# ------------------------------------------------------------------ Untie hash
- unless (untie(%hash)) {
- &Apache::lonnet::logthis("<font color=blue>WARNING: ".
- "Could not untie coursemap $fn (browse).</font>");
- }
+ unless (untie(%hash)) {
+ &Apache::lonnet::logthis("<font color=blue>WARNING: ".
+ "Could not untie coursemap $fn (browse).</font>");
+ }
# -------------------------------------------------------------------- All done
- return OK;
+ return OK;
# ----------------------------------------------- Errors, hash could no be tied
- }
- } else {
- $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
- return HTTP_NOT_ACCEPTABLE;
-}
-} else {
- $ENV{'user.error.msg'}=
+ }
+ } else {
+ $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
+ return HTTP_NOT_ACCEPTABLE;
+ }
+ } else {
+ $ENV{'user.error.msg'}=
$r->uri.":vgr:0:0:Cannot view grades for complete course";
- return HTTP_NOT_ACCEPTABLE;
-
-}
+ return HTTP_NOT_ACCEPTABLE;
+ }
}
1;
__END__
--minaeibi1014145090--