# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
# $Id: grades.pm,v 1.28 2002/06/20 21:21:16 ng Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# 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
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
# 2/9,2/13 Guy Albertelli
# 6/8 Gerd Kortemeyer
# 7/26 H.K. Ng
# 8/20 Gerd Kortemeyer
package Apache::grades;
use strict;
use Apache::style;
use Apache::lonxml;
use Apache::lonnet;
use Apache::loncommon;
use Apache::lonhomework;
use Apache::Constants qw(:common);
sub moreinfo {
my ($request,$reason) = @_;
$request->print("Unable to process request: $reason");
if ( $Apache::grades::viewgrades eq 'F' ) {
$request->print('
');
}
return '';
}
sub verifyreceipt {
my $request=shift;
my $courseid=$ENV{'request.course.id'};
my $cdom=$ENV{"course.$courseid.domain"};
my $cnum=$ENV{"course.$courseid.num"};
my $receipt=unpack("%32C*",$Apache::lonnet::perlvar{'lonHostID'}).'-'.
$ENV{'form.receipt'};
$receipt=~s/[^\-\d]//g;
my $symb=$ENV{'form.symb'};
unless ($symb) {
$symb=&Apache::lonnet::symbread($ENV{'form.url'});
}
if ((&Apache::lonnet::allowed('mgr',$courseid)) && ($symb)) {
$request->print('Verifying Submission Receipt '.$receipt.'
');
my $matches=0;
my (%classlist) = &getclasslist($cdom,$cnum,'0');
foreach my $student ( sort(@{ $classlist{'allids'} }) ) {
my ($uname,$udom)=split(/\:/,$student);
if ($receipt eq
&Apache::lonnet::ireceipt($uname,$udom,$courseid,$symb)) {
$request->print('Matching '.$student.'
');
$matches++;
}
}
$request->print(''.$matches.' match(es)
');
}
return '';
}
sub listStudents {
my ($request) = shift;
my $cdom=$ENV{"course.$ENV{'request.course.id'}.domain"};
my $cnum=$ENV{"course.$ENV{'request.course.id'}.num"};
my $hostver=unpack("%32C*",$Apache::lonnet::perlvar{'lonHostID'});
$request->print(<Verify a Submission Receipt Issued by this Server
ENDPICK
}
sub csvuploadmap {
my ($request)= @_;
my ($symb,$url)=&get_symb_and_url($request);
if (!$symb) {return '';}
my $datatoken;
if (!$ENV{'form.datatoken'}) {
$datatoken=&Apache::loncommon::upfile_store($request);
} else {
$datatoken=$ENV{'form.datatoken'};
&Apache::loncommon::load_tmp_file($request);
}
my @records=&Apache::loncommon::upfile_record_sep();
&csvuploadmap_header($request,$symb,$url,$datatoken,$#records+1);
my $i;
my $keyfields;
if (@records) {
my @fields=&csvupload_fields($url);
if ($ENV{'form.upfile_associate'} eq 'reverse') {
&Apache::loncommon::csv_print_samples($request,\@records);
$i=&Apache::loncommon::csv_print_select_table($request,\@records,
\@fields);
foreach (@fields) { $keyfields.=$_->[0].','; }
chop($keyfields);
} else {
unshift(@fields,['none','']);
$i=&Apache::loncommon::csv_samples_select_table($request,\@records,
\@fields);
my %sone=&Apache::loncommon::record_sep($records[0]);
$keyfields=join(',',sort(keys(%sone)));
}
}
&csvuploadmap_footer($request,$i,$keyfields);
return '';
}
sub csvuploadassign {
my ($request)= @_;
my ($symb,$url)=&get_symb_and_url($request);
if (!$symb) {return '';}
&Apache::loncommon::load_tmp_file($request);
my @gradedata=&Apache::loncommon::upfile_record_sep();
my @keyfields = split(/\,/,$ENV{'form.keyfields'});
my %fields=();
for (my $i=0; $i<=$ENV{'form.nfields'}; $i++) {
if ($ENV{'form.upfile_associate'} eq 'reverse') {
if ($ENV{'form.f'.$i} ne 'none') {
$fields{$keyfields[$i]}=$ENV{'form.f'.$i};
}
} else {
if ($ENV{'form.f'.$i} ne 'none') {
$fields{$ENV{'form.f'.$i}}=$keyfields[$i];
}
}
}
$request->print('Assigning Grades
');
&Apache::lonhomework::showhash(('1'=>\@keyfields));
&Apache::lonhomework::showhash(%fields);
my $courseid=$ENV{'request.course.id'};
my $cdom=$ENV{"course.$courseid.domain"};
my $cnum=$ENV{"course.$courseid.num"};
my (%classlist) = &getclasslist($cdom,$cnum,'1');
foreach my $student ( sort(@{ $classlist{'allids'} }) ) {
my %newhash;
foreach my $grade (@gradedata) {
my %entries=&Apache::loncommon::record_sep($grade);
foreach my $dest (keys(%fields)) {
}
}
}
}
sub send_header {
my ($request)= @_;
$request->print(&Apache::lontexconvert::header());
# $request->print("
#");
$request->print('');
}
sub send_footer {
my ($request)= @_;
$request->print('');
$request->print(&Apache::lontexconvert::footer());
}
sub handler {
my $request=$_[0];
if ( $ENV{'user.name'} eq 'albertel' ) {$Apache::lonxml::debug=1;} else {$Apache::lonxml::debug=0;}
if ($ENV{'browser.mathml'}) {
$request->content_type('text/xml');
} else {
$request->content_type('text/html');
}
$request->send_http_header;
return OK if $request->header_only;
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
my $url=$ENV{'form.url'};
my $symb=$ENV{'form.symb'};
my $command=$ENV{'form.command'};
if (!$url) {
my ($temp1,$temp2);
($temp1,$temp2,$ENV{'form.url'})=split(/___/,$symb);
$url = $ENV{'form.url'};
}
&send_header($request);
if ($url eq '' && $symb eq '') {
if ($ENV{'user.adv'}) {
if (($ENV{'form.codeone'}) && ($ENV{'form.codetwo'}) &&
($ENV{'form.codethree'})) {
my $token=$ENV{'form.codeone'}.'*'.$ENV{'form.codetwo'}.'*'.
$ENV{'form.codethree'};
my ($tsymb,$tuname,$tudom,$tcrsid)=
&Apache::lonnet::checkin($token);
if ($tsymb) {
my ($map,$id,$url)=split(/\_\_\_/,$tsymb);
if (&Apache::lonnet::allowed('mgr',$tcrsid)) {
$request->print(
&Apache::lonnet::ssi('/res/'.$url,
('grade_username' => $tuname,
'grade_domain' => $tudom,
'grade_courseid' => $tcrsid,
'grade_symb' => $tsymb)));
} else {
$request->print('Not authorized: '.$token.'
');
}
} else {
$request->print('Not a valid DocID: '.$token.'
');
}
} else {
$request->print(&Apache::lonxml::tokeninputfield());
}
}
} else {
&Apache::lonhomework::showhashsubset(\%ENV,'^form');
$Apache::grades::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});
if ($command eq 'submission') {
&listStudents($request) if ($ENV{'form.student'} eq '');
$request->print(&submission($request)) if ($ENV{'form.student'} ne '');
} elsif ($command eq 'gradingmenu') {
$request->print(&gradingmenu($request));
} elsif ($command eq 'viewgrades') {
$request->print(&viewgrades($request));
} elsif ($command eq 'editgrades') {
$request->print(&editgrades($request));
} elsif ($command eq 'verify') {
$request->print(&verifyreceipt($request));
} elsif ($command eq 'csvupload') {
$request->print(&csvupload($request));
} elsif ($command eq 'csvuploadmap') {
$request->print(&csvuploadmap($request));
} elsif ($command eq 'csvuploadassign') {
if ($ENV{'form.associate'} ne 'Reverse Association') {
$request->print(&csvuploadassign($request));
} else {
if ( $ENV{'form.upfile_associate'} ne 'reverse' ) {
$ENV{'form.upfile_associate'} = 'reverse';
} else {
$ENV{'form.upfile_associate'} = 'forward';
}
$request->print(&csvuploadmap($request));
}
} else {
$request->print("Unknown action: $command:");
}
}
&send_footer($request);
return OK;
}
1;
__END__;