--- loncom/homework/grades.pm 2001/02/09 03:24:45 1.2
+++ loncom/homework/grades.pm 2002/07/07 20:08:45 1.36
@@ -1,50 +1,1430 @@
+# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
-# Guy Albertelli
-# 11/30 Gerd Kortemeyer
-# 6/1 Gerd Kortemeyer
+#
+# $Id: grades.pm,v 1.36 2002/07/07 20:08:45 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
+# Year 2002
+# June, July 2002 H.K. Ng
+#
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");
- $request->print('
');
+ 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('all','0');
+ foreach my $student ( sort(@{ $$classlist{'all'} }) ) {
+ my ($uname,$udom)=split(/\:/,$student);
+ if ($receipt eq
+ &Apache::lonnet::ireceipt($uname,$udom,$courseid,$symb)) {
+ $request->print('Matching '.$student.' ');
+ $matches++;
+ }
+ }
+ $request->printf('
'.$matches." match%s
",$matches <= 1 ? '' : 'es');
+# needs to print who is matched
+ }
+ return '';
+}
+
+sub student_gradeStatus {
+ my ($url,$udom,$uname) = @_;
+ my $symb=($ENV{'form.symb'} ne '' ? $ENV{'form.symb'} : (&Apache::lonnet::symbread($url)));
+ my %record= &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname);
+ foreach my $part (&getpartlist($url)) {
+ my ($temp,$part,$type)=split(/_/,$part);
+ if ($type eq 'solved') {
+ my ($status,$foo)=split(/_/,$record{"resource.$part.$type"},2);
+ $status = 'partial' if ($foo =~ /^partially/);
+ $status = 'nothing' if ($status eq '');
+ return $type,$status;
+ }
+ }
+ return '';
+}
+
+sub get_fullname {
+ my ($sname,$sdom) = @_;
+ my %name=&Apache::lonnet::get('environment', ['lastname','generation',
+ 'firstname','middlename'],
+ $sdom,$sname);
+ my $fullname;
+ my ($tmp) = keys(%name);
+ if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
+ $fullname=$name{'lastname'}.$name{'generation'};
+ if ($fullname =~ /[^\s]+/) { $fullname.=', '; }
+ $fullname.=$name{'firstname'}.' '.$name{'middlename'};
+ }
+ return $fullname;
}
+sub listStudents {
+ my ($request) = shift;
+ my $cdom =$ENV{"course.$ENV{'request.course.id'}.domain"};
+ my $cnum =$ENV{"course.$ENV{'request.course.id'}.num"};
+ my $getsec =$ENV{'form.section'};
+ my $submitonly=$ENV{'form.submitonly'};
+ $request->print(< View Submissions for a Student or a Group of Students
+ Resource: $ENV{'form.url'}
+
+ View Problem: no
+ yes
+ Submissions: last
+ all
+
+
+
+
+
+
+
Select
Username
+
Fullname
Domain
+
Grade Status
+ENDTABLEST
+ if ($ENV{'form.url'}) {
+ $request->print(''."\n");
+ }
+ if ($ENV{'form.symb'}) {
+ $request->print(''."\n");
+ }
+ $request->print(''."\n");
+
+ my ($classlist) = &getclasslist($getsec,'0');
+ foreach my $student ( sort(@{ $$classlist{$getsec} }) ) {
+ my ($sname,$sdom) = split(/:/,$student);
+ my ($type,$status) = &student_gradeStatus($ENV{'form.url'},$cdom,$sname);
+ next if ($status eq 'nothing' && $submitonly eq 'yes');
+
+ my $fullname = &get_fullname($sname,$sdom);
+ if ( $Apache::grades::viewgrades eq 'F' ) {
+ $request->print("\n".'
'.
+ '
'."\n".
+ '
'.$sname.'
'."\n".
+ '
'.$fullname.'
'."\n".
+ '
'.$sdom.'
'."\n");
+ $request->print('
'.$status.'
'."\n");
+
+ $request->print('
');
+ }
+ }
+ $request->print('
');
+ $request->print('');
+}
+
+sub processGroup {
+ my ($request) = shift;
+ my $ctr = 0;
+ my @stuchecked = (ref($ENV{'form.stuinfo'}) ? @{$ENV{'form.stuinfo'}}
+ : ($ENV{'form.stuinfo'}));
+ my $total = scalar(@stuchecked)-1;
+ if ($stuchecked[0] eq '') {
+ &userError($request,'No student was selected for viewing/grading.');
+ return;
+ }
+ foreach (@stuchecked) {
+ my ($sname,$sdom,$fullname) = split(/:/);
+ $ENV{'form.student'} = $sname;
+ $ENV{'form.fullname'} = $fullname;
+ &submission($request,$ctr,$total);
+ $ctr++;
+ }
+ return 'The End';
+}
+
+sub userError {
+ my ($request, $reason, $step) = @_;
+ $request->print('
LON-CAPA User Error
'."\n");
+ $request->print('Reason: '.$reason.'
'."\n");
+ $request->print('Step: '.($step ne '' ? $step : 'Use your browser back button to correct')
+ .'
'."\n");
+ return '';
+}
+
+#FIXME - needs to handle multiple matches
sub finduser {
my ($name) = @_;
-
+ my $domain = '';
+ if ( $Apache::grades::viewgrades eq 'F' ) {
+ my ($classlist) = &getclasslist('all','0');
+ foreach ( sort(@{ $$classlist{'all'} }) ) {
+ my ($posname,$posdomain) = split(/:/);
+ if ($posname =~ $name) { $name=$posname; $domain=$posdomain; last; }
+ }
+ return ($name,$domain);
+ } else {
+ return ($ENV{'user.name'},$ENV{'user.domain'});
+ }
+}
+
+sub getclasslist {
+ my ($getsec,$hideexpired) = @_;
+ my ($coursedomain,$coursenum) = split(/_/,$ENV{'request.course.id'});
+ my %classlist=&Apache::lonnet::dump('classlist',$coursedomain,$coursenum);
+ my $now = time;
+ my (@holdsec,@sections);
+ foreach my $student (keys(%classlist)) {
+ my ($end,$start)=split(/:/,$classlist{$student});
+ # still a student?
+ if (($hideexpired) && ($end) && ($end < $now)) {
+ next;
+ }
+ my ($unam,$udom) = split(/:/,$student,2);
+ my $section = &Apache::lonnet::usection($udom,$unam,$ENV{'request.course.id'});
+ $section = ($section ne '-1' ? $section : 'no');
+ push @holdsec,$section;
+ push (@{ $classlist{$getsec} }, $student) if ($getsec eq 'all' || $getsec eq $section);
+ }
+ my %seen = ();
+ foreach my $item (@holdsec) {
+ push (@sections, $item) unless $seen{$item}++;
+ }
+ return (\%classlist,\@sections);
+}
+
+sub getpartlist {
+ my ($url) = @_;
+ my @parts =();
+ my (@metakeys) = split(/,/,&Apache::lonnet::metadata($url,'keys'));
+ foreach my $key (@metakeys) {
+ if ( $key =~ m/stores_([0-9]+)_.*/) {
+ push(@parts,$key);
+ }
+ }
+ return @parts;
}
+sub viewstudentgrade {
+ my ($url,$symb,$courseid,$student,@parts) = @_;
+ my $result ='';
+ my $cellclr = '"#ffffdd"';
+ my ($username,$domain) = split(/:/,$student);
+
+ my $fullname = &get_fullname($username,$domain);
+ my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$username);
+
+ $result.="
$username
$fullname
$domain
\n";
+ foreach my $part (@parts) {
+ my ($temp,$part,$type)=split(/_/,$part);
+ my $score=$record{"resource.$part.$type"};
+ if ($type eq 'awarded' || $type eq 'tries') {
+ $result.='
';
+ return $result;
+}
+
+#FIXME need to look at the metadata spec on what type of data to accept and provide an
+#interface based on that, also do that to above function.
+sub setstudentgrade {
+ my ($url,$symb,$courseid,$student,@parts) = @_;
+ print "set student grade parts=@parts ";
+ my $result ='';
+ my ($stuname,$domain) = split(/:/,$student);
+ my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$stuname);
+ my %newrecord;
+
+ foreach my $part (@parts) {
+ my ($temp,$part,$type)=split(/_/,$part);
+ my $oldscore=$record{"resource.$part.$type"};
+ my $newscore=$ENV{"form.GRADE.$student.$part.$type"};
+ print "old=$oldscore:new=$newscore: ";
+ if ($type eq 'solved') {
+ my $update=0;
+ if ($newscore eq 'nothing' ) {
+ if ($oldscore ne '') {
+ $update=1;
+ $newscore = '';
+ }
+ } elsif ($oldscore !~ m/^$newscore/) {
+ $update=1;
+ $result.="Updating $stuname to $newscore \n";
+ if ($newscore eq 'correct') { $newscore = 'correct_by_override'; }
+ if ($newscore eq 'incorrect') { $newscore = 'incorrect_by_override'; }
+ if ($newscore eq 'excused') { $newscore = 'excused'; }
+ if ($newscore eq 'ungraded') { $newscore = 'ungraded_attempted'; }
+ if ($newscore eq 'partial') { $newscore = 'correct_partially_by_override'; }
+ } else {
+ #$result.="$stuname:$part:$type:unchanged $oldscore to $newscore: \n";
+ }
+ if ($update) { $newrecord{"resource.$part.$type"}=$newscore; }
+ } else {
+ if ($oldscore ne $newscore) {
+ $newrecord{"resource.$part.$type"}=$newscore;
+ $result.="Updating $student"."'s status for $part.$type to $newscore \n";
+ } else {
+ #$result.="$stuname:$part:$type:unchanged $oldscore to $newscore: \n";
+ }
+ }
+ }
+ if ( scalar(keys(%newrecord)) > 0 ) {
+ $newrecord{'resource.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
+# &Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$stuname);
+
+ $result.="Stored away ".scalar(keys(%newrecord))." elements. \n";
+ }
+ return $result;
+}
+
+#
+# --------------------------- show submissions of a student, option to grade --------
sub submission {
- my ($request) = @_;
- if ($ENV{'form.student'} eq '') { &moreinfo($request,"Need student login id"); return ''; }
+ my ($request,$counter,$total) = @_;
+
+ if ($counter == 0) {
+ $request->print(<
+ function updateRadio(radioButton,formtextbox,formsel,wgt) {
+ var pts = formtextbox.value;
+ var resetbox =false;
+ if (isNaN(pts) || pts < 0) {
+ alert("A number equal or greater than 0 is expected. Entered value = "+pts);
+ for (var i=0; i 0 && pts < wgt) {
+ formsel[4].selected = true;
+ }
+ if (pts == wgt) {
+ formsel[0].selected = true;
+ }
+ return;
+ }
+
+ function keywords(keyform) {
+ var keywds = keyform.value;
+ var nret = prompt("Keywords list, separated by a space. Add/delete to list if desired.",keywds);
+ if (nret==null) return;
+ keyform.value = nret;
+ return;
+ }
+
+//===================== Script to add keyword(s) ==================
+ function getSel() {
+ if (document.getSelection) txt = document.getSelection();
+ else if (document.selection) txt = document.selection.createRange().text;
+ else return;
+ var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," ");
+ if (cleantxt=="") {
+ alert("Select a word or group of words from document and then click this link.");
+ return;
+ }
+ var nret = prompt("Add selection to keyword list?",cleantxt);
+ if (nret==null) return;
+ var curlist = document.SCORE.keywords.value;
+ document.SCORE.keywords.value = curlist+" "+nret;
+ return;
+ }
+
+//====================== Script for composing message ==============
+ function msgCenter(msgform,usrctr,fullname) {
+ var Nmsg = msgform.savemsgN.value;
+ savedMsgHeader(Nmsg,usrctr,fullname);
+ var subject = msgform.msgsub.value;
+ displaySubject(subject);
+ for (var i=1; i<=Nmsg; i++) {
+ var message = eval("document.SCORE.savemsg"+i+".value");
+ displaySavedMsg(i,message);
+ }
+ newmsg = eval("document.SCORE.newmsg"+usrctr+".value");
+ newMsg(newmsg);
+ msgTail();
+ return;
+ }
+
+function savedMsgHeader(Nmsg,usrctr,fullname) {
+ var height = 30*Nmsg+250;
+ var scrollbar = "no";
+ if (height > 600) {
+ height = 600;
+ scrollbar = "yes";
+ }
+ pWin = window.open('', 'MessageCenter', 'toolbar=no,location=no,scrollbars='+scrollbar+',width=600,height='+height);
+ pWin.document.write("");
+ pWin.document.write("Message Central");
+
+ pWin.document.write("
+SUBJAVASCRIPT
+}
+ (my $url=$ENV{'form.url'})=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
+ if ($ENV{'form.student'} eq '') { &moreinfo($request,'Need student login id'); return ''; }
my ($uname,$udom) = &finduser($ENV{'form.student'});
- if ($uname eq '') { &moreinfo($request,"Unable to find student"); return ''; }
-# my $answer=&Apache::lonnet::reply(
-# "restore:$udom:$uname:".
-# $ENV{'request.course.id'}.':'.
-# &Apache::lonnet::escape($symb),
-# &Apache::lonnet::homeserver($uname,$udom));
+ if ($uname eq '') { &moreinfo($request,'Unable to find student'); return ''; }
+
+ my $symb=($ENV{'form.symb'} ne '' ? $ENV{'form.symb'} : (&Apache::lonnet::symbread($url)));
+ if ($symb eq '') { $request->print("Unable to handle ambiguous references:$url:."); return ''; }
+ my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : '');
+#
+# header info
+ if ($counter == 0) {
+ $request->print('
Submission Record
'.
+ ' Resource: '.$url.'');
+ }
+
+#
+# option to display problem, only once else it cause problems with the form later since the problem has a form.
+ if ($ENV{'form.vProb'} eq 'yes' && $counter == 0) {
+ my $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom,
+ $ENV{'request.course.id'});
+ my $companswer=&Apache::loncommon::get_student_answers($symb,$uname,$udom,
+ $ENV{'request.course.id'});
+ my $result.='
'."\n";
+ return $result;
+}
+
+sub viewGradeaStu_form {
+ my ($symb,$url,$response,$handgrade) = @_;
+ my ($classlist,$sections) = &getclasslist('all','0');
+ my $result.='
'."\n";
+ $result.='
'."\n";
+ $result.=' View/Grade an Individual Student\'s Submission
'."\n";
+ $result.='
'."\n";
+ $result.=''."\n";
+ $result.='
'."\n";
+ $result.='
'."\n";
+ return $result;
+}
+
+sub verifyReceipt_form {
+ my ($symb,$url) = @_;
+ 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'});
+
+ my $result.='
'."\n";
+ $result.='
'."\n";
+ $result.=' Verify a Submission Receipt Issued by this Server
'."\n";
+ $result.='
'."\n";
+ $result.='';
+ $result.='
'."\n";
+ $result.='
'."\n";
+ return $result;
+}
+
+sub viewgrades {
+ my ($request) = @_;
+ my $result='';
+
+ #get resource reference
+ my ($symb,$url)=&get_symb_and_url($request);
+ if (!$symb) {return '';}
+ #get classlist
+ my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'});
+ #print "Found $cdom:$cnum ";
+ my ($classlist) = &getclasslist('all','0');
+ my $headerclr = '"#ccffff"';
+ my $cellclr = '"#ffffcc"';
+
+ #get list of parts for this problem
+ my (@parts) = sort(&getpartlist($url));
+
+ $request->print ("
Manual Grading
");
+
+ #start the form
+ $result = '';
+ $result.=&show_grading_menu_form($symb,$url);
+ return $result;
+}
+
+sub editgrades {
+ my ($request) = @_;
+ my $result='';
+
+ my $symb=$ENV{'form.symb'};
+ if ($symb eq '') { $request->print("Unable to handle ambiguous references:$symb:$ENV{'form.url'}"); return ''; }
+ my $url=$ENV{'form.url'};
+ #get classlist
+# my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'});
+ #print "Found $cdom:$cnum ";
+ my ($classlist) = &getclasslist('all','0');
+
+ #get list of parts for this problem
+ my (@parts) = &getpartlist($url);
+
+ $result.='';
+ return $result;
+}
+
+sub csvupload_javascript_reverse_associate {
+ return(<2) { foundsomething=1; }
+ }
+ if (founduname==0 || founddomain==0) {
+ alert('You need to specify at both the username and domain');
+ return;
+ }
+ if (foundsomething==0) {
+ alert('You need to specify at least one grading field');
+ return;
+ }
+ vf.submit();
+ }
+ function flip(vf,tf) {
+ var nw=eval('vf.f'+tf+'.selectedIndex');
+ var i;
+ //can not pick the same destination field twice
+ for (i=0;i<=vf.nfields.value;i++) {
+ if ((i!=tf) && (eval('vf.f'+i+'.selectedIndex')==nw)) {
+ eval('vf.f'+i+'.selectedIndex=0;')
+ }
+ }
+ }
+ENDPICK
+}
+
+sub csvuploadmap_header {
+ my ($request,$symb,$url,$datatoken,$distotal)= @_;
+ my $result;
+ my $javascript;
+ if ($ENV{'form.upfile_associate'} eq 'reverse') {
+ $javascript=&csvupload_javascript_reverse_associate();
+ } else {
+ $javascript=&csvupload_javascript_forward_associate();
+ }
+ $request->print(<
+
Uploading Class Grades for resource $url
+
+
Identify fields
+Total number of records found in file: $distotal
+Enter as many fields as you can. The system will inform you and bring you back
+to this page if the data selected is insufficient to run your class.
+
+
+
+
+
+
+
+
+
+
+
+
+ENDPICK
+ return '';
+
+}
+
+sub csvupload_fields {
+ my ($url) = @_;
+ my (@parts) = &getpartlist($url);
+ my @fields=(['username','Student Username'],['domain','Student Domain']);
+ foreach my $part (sort(@parts)) {
+ my @datum;
+ my $display=&Apache::lonnet::metadata($url,$part.'.display');
+ my $name=$part;
+ if (!$display) { $display = $name; }
+ @datum=($name,$display);
+ push(@fields,\@datum);
+ }
+ return (@fields);
+}
+
+sub csvuploadmap_footer {
+ my ($request,$i,$keyfields) =@_;
+ $request->print(<
+
+
+
+
+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
');
+ my $courseid=$ENV{'request.course.id'};
+# my $cdom=$ENV{"course.$courseid.domain"};
+# my $cnum=$ENV{"course.$courseid.num"};
+ my ($classlist) = &getclasslist('all','1');
+ my @skipped;
+ my $countdone=0;
+ foreach my $grade (@gradedata) {
+ my %entries=&Apache::loncommon::record_sep($grade);
+ my $username=$entries{$fields{'username'}};
+ my $domain=$entries{$fields{'domain'}};
+ if (!exists($$classlist{"$username:$domain"})) {
+ push(@skipped,"$username:$domain");
+ next;
+ }
+ my %grades;
+ foreach my $dest (keys(%fields)) {
+ if ($dest eq 'username' || $dest eq 'domain') { next; }
+ if ($entries{$fields{$dest}} eq '') { next; }
+ my $store_key=$dest;
+ $store_key=~s/^stores/resource/;
+ $store_key=~s/_/\./g;
+ $grades{$store_key}=$entries{$fields{$dest}};
+ }
+ $grades{"resource.regrader"}="$ENV{'user.name'}:$ENV{'user.domain'}";
+ &Apache::lonnet::cstore(\%grades,$symb,$ENV{'request.course.id'},
+ $domain,$username);
+ $request->print('.');
+ $request->rflush();
+ $countdone++;
+ }
+ $request->print(" Stored $countdone students\n");
+ if (@skipped) {
+ $request->print(' Skipped Students ');
+ foreach my $student (@skipped) { $request->print(" $student"); }
+ }
+ $request->print(&view_edit_entire_class_form($symb,$url));
+ $request->print(&show_grading_menu_form($symb,$url));
return '';
}
sub send_header {
my ($request)= @_;
$request->print(&Apache::lontexconvert::header());
+# $request->print("
+#");
$request->print('');
}
@@ -57,8 +1437,6 @@ sub send_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 {
@@ -66,18 +1444,80 @@ sub handler {
}
$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 '') {
- $request->print("Non-Contextual Access Unsupported:$command:$url:");
+ 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('
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.