--- loncom/homework/grades.pm 2002/07/01 21:20:29 1.34 +++ loncom/homework/grades.pm 2002/07/08 21:18:54 1.37 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.34 2002/07/01 21:20:29 ng Exp $ +# $Id: grades.pm,v 1.37 2002/07/08 21:18:54 ng Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,7 +30,7 @@ # 7/26 H.K. Ng # 8/20 Gerd Kortemeyer # Year 2002 -# June 2002 H.K. Ng +# June, July 2002 H.K. Ng # package Apache::grades; @@ -53,6 +53,7 @@ sub moreinfo { if ($ENV{'form.symb'}) { $request->print(''."\n"); } +# $request->print(''."\n"); $request->print(''."\n"); $request->print("Student:".''."
\n"); $request->print("Domain:".''."
\n"); @@ -135,11 +136,15 @@ sub listStudents {  Resource: $ENV{'form.url'}

 View Options
 View Problem: no - yes -   Submissions: last - all + yes
Submissions: + last sub only + last sub & parts info + all details + + '."\n"; + $result.=''."\n"; + } + } + $result.='
@@ -181,31 +186,39 @@ sub processGroup { my ($request) = shift; my $ctr = 0; my @stuchecked = (ref($ENV{'form.stuinfo'}) ? @{$ENV{'form.stuinfo'}} - : ($ENV{'form.stuinfo'}) ); + : ($ENV{'form.stuinfo'})); my $total = scalar(@stuchecked)-1; - foreach my $student (@stuchecked) { - my ($sname,$sdom,$fullname) = split(/:/,$student); + 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' ) { - #get classlist -# my ($cdom,$cnum) = split(/_/,$ENV{'request.course.id'}); - #print "Found $cdom:$cnum
"; my ($classlist) = &getclasslist('all','0'); - foreach my $student ( sort(@{ $$classlist{'all'} }) ) { - my ($posname,$posdomain) = split(/:/,$student); + foreach ( sort(@{ $$classlist{'all'} }) ) { + my ($posname,$posdomain) = split(/:/); if ($posname =~ $name) { $name=$posname; $domain=$posdomain; last; } } return ($name,$domain); @@ -228,8 +241,9 @@ sub getclasslist { } 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' or $getsec == $section); + push (@{ $classlist{$getsec} }, $student) if ($getsec eq 'all' || $getsec eq $section); } my %seen = (); foreach my $item (@holdsec) { @@ -326,10 +340,6 @@ sub setstudentgrade { } if ( scalar(keys(%newrecord)) > 0 ) { $newrecord{'resource.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}"; - print "grader=$newrecord{'resource.regrader'}:
records
"; - while (my ($k,$v) = each %newrecord) { - print "k=$k:v=$v:
\n"; - } # &Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$stuname); $result.="Stored away ".scalar(keys(%newrecord))." elements.
\n"; @@ -343,7 +353,7 @@ sub submission { my ($request,$counter,$total) = @_; if ($counter == 0) { - $request->print(<print(< function updateRadio(radioButton,formtextbox,formsel,wgt) { var pts = formtextbox.value; @@ -390,25 +400,255 @@ sub submission { 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; + var rtrchk = eval("document.SCORE.includemsg"+usrctr); + var msgchk = rtrchk.value; +// alert("checked=>"+msgchk); + re = /msgsub/; + var shwsel = ""; + if (re.test(msgchk)) { shwsel = "checked" } + displaySubject(subject,shwsel); + for (var i=1; i<=Nmsg; i++) { + var testpt = "savemsg"+i+","; + re = /testpt/; + shwsel = ""; + if (re.test(msgchk)) { shwsel = "checked" } + var message = eval("document.SCORE.savemsg"+i+".value"); + displaySavedMsg(i,message,shwsel); + } + newmsg = eval("document.SCORE.newmsg"+usrctr+".value"); + shwsel = ""; + re = /newmsg/; + if (re.test(msgchk)) { shwsel = "checked" } + newMsg(newmsg,shwsel); + msgTail(); + return; + } + +function savedMsgHeader(Nmsg,usrctr,fullname) { + var height = 30*Nmsg+250; + var scrollbar = "no"; + if (height > 600) { + height = 600; + scrollbar = "yes"; + } +/* if (window.pWin) + window.pWin.close(); */ + 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(" -JAVASCRIPT +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 ''; } + 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 ''; } + 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 + + # header info if ($counter == 0) { - $request->print('

Submission Record

'); + $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. + # 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'}); @@ -422,50 +662,120 @@ JAVASCRIPT $result.='
 Select  Username 

'; $request->print($result); } -# -# beginning of form + + # beginning of form if ($counter == 0) { + my %keyhash = &Apache::lonnet::dump('nohist_handgrade', + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + + my $loginuser = $ENV{'user.name'}.':'.$ENV{'user.domain'}; + # if the handgrade db has never being initialized then set some default values + if ($keyhash{$symb.'_handgrade'} eq '') { + $keyhash{$symb.'_keywords'} = ''; + $keyhash{$symb.'_subject'} = &Apache::lonnet::metadata($url,'title'); + $keyhash{$loginuser.'_kwclr'} = $keyhash{$loginuser.'_kwclr'} eq '' ? 'red' : $keyhash{$loginuser.'_kwclr'}; + $keyhash{$loginuser.'_kwsize'} = $keyhash{$loginuser.'_kwsize'} eq '' ? '0' : $keyhash{$loginuser.'_kwsize'}; + $keyhash{$loginuser.'_kwstyle'} = $keyhash{$loginuser.'_kwstyle'} eq '' ? '' : $keyhash{$loginuser.'_kwstyle'}; + $keyhash{$symb.'_savemsgN'} = '0'; + } $request->print(''."\n". - ''."\n". - ''."\n". - ''."\n". - ''."\n". - ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". ''."\n". - ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". ''."\n"); + ' value="'.($ENV{'form.NTSTU'} ne '' ? $ENV{'form.NTSTU'} : $total+1).'" />'."\n"); + + my ($cts,$prnmsg) = (1,''); + while ($cts <= $keyhash{$symb.'_savemsgN'}) { + $prnmsg.=''."\n"; + $cts++; + } + $request->print($prnmsg); + + if ($ENV{'form.handgrade'} eq 'yes') { + $request->print(<Keyword Options  +Keyword List    +Paste Selection to Keyword list    +Keyword Highlight Attribute

+KEYWORDS + } } -# -# Student info + + # Student info $request->print(($counter == 0 ? '' : '


')); + my $fullname = ($ENV{'form.fullname'} ne '' ? $ENV{'form.fullname'} : &get_fullname($uname,$udom)); my $result.=''; - $result.='
Username: '.$uname. - 'Fullname: '. - ($ENV{'form.fullname'} ne '' ? $ENV{'form.fullname'} : &get_fullname($uname,$udom)). + 'Fullname: '.$fullname. 'Domain: '.$udom.'
Resource: '.$url.'
'; + if ($ENV{'form.handgrade'} eq 'yes') { +# my $subonly = &get_last_submission($symb,$uname,$udom,$ENV{'request.course.id'}); + my ($classlist) = &getclasslist('all','0'); + my @collaborators; +# foreach ( sort(@{ $$classlist{'all'} }) ) { +# my ($sname,$sdom) = split(/:/); +# push @collaborators,$sname if (grep /\b$sname(\b|\.)/i,$subonly); +# } +# push @collaborators,'leede','carlandmm','freyniks'; # as a test to display collaborators. + if (scalar(@collaborators) != 0) { + $result.='
Collaborators: '; + foreach (@collaborators) { + $result.=$_.' ('.&get_fullname($_,$udom).')    '; + } + $result.='
'."\n"; $request->print($result); -# -# print student answer - my $answer=&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, - $ENV{'request.course.id'},$last); - $request->print($answer); - $answer =~ m/.*<\/tr>.*?(.*?)(.*?)<\/td>/; - print "Submitted=$1:
$2;"; -# + + # print student answer + if ($ENV{'form.lastSub'} eq 'lastonly') { + my ($string,$timestamp)=&get_last_submission ($symb,$uname,$udom,$ENV{'request.course.id'}); + $string=&keywords_highlight($string); + my $lastsubonly='
'; + $lastsubonly.=''; + $lastsubonly.=''; + $lastsubonly.='
Last Submission Only'. + ($timestamp eq '' ? '' : '    Date Submitted: '.$timestamp).'
'; + $lastsubonly.=$string; + $lastsubonly.='
'."\n"; + $request->print($lastsubonly); + } else { + $request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, + $ENV{'request.course.id'},$last, + '.submission','Apache::grades::keywords_highlight')); + } + my $wgt = &Apache::lonnet::EXT('resource.partid.weight',$symb,$udom,$uname); my $wgtmsg = ($wgt > 0 ? '(problem weight)' : 'problem weight assigned by computer'); $wgt = ($wgt > 0 ? $wgt : '1'); my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); my $score = ($record{'resource.0.awarded'} eq '' ? '' : $record{'resource.0.awarded'}*$wgt); -# -# display grading options + # display grading options $result=''. ''."\n"; + $result.=''."\n"; + $result.=''."\n"; $result.='
Points'; - my $ctr = 0; + my $ctr = 0; $result.=''; # display radio buttons in a nice table with 10 across while ($ctr<=$wgt) { $result.= '\n"; + $result.="  \n"; + $result.='Compose Message'."\n"; } } $result.='
partial'."\n"; $optsel =~ s/
'; $request->print($result); -# -# print end of form + + # print end of form if ($counter == $total) { my $endform.='
'; my $ntstu =''; + $result.=''. + ''; + $result.=''. + ''; + $result.='
Resource: '.$url.'
Type: '.$responsetype.'  Handgrade: '.$handgrade.'
'; $result.=&view_edit_entire_class_form($symb,$url).'
'; $result.=&upcsvScores_form($symb,$url).'
'; - $result.=&viewGradeaStu_form($symb,$url).'
'; + $result.=&viewGradeaStu_form($symb,$url,$responsetype,$handgrade).'
'; $result.=&verifyReceipt_form($symb,$url); return $result; } @@ -718,7 +1121,7 @@ ENDUPFORM } sub viewGradeaStu_form { - my ($symb,$url) = @_; + my ($symb,$url,$response,$handgrade) = @_; my ($classlist,$sections) = &getclasslist('all','0'); my $result.='
'."\n"; $result.='
'."\n"; @@ -727,7 +1130,9 @@ sub viewGradeaStu_form { $result.=''."\n". ''."\n". ''."\n". - ''."\n"; + ''."\n". + ''."\n". + ''."\n"; $result.=' Select section: submitted'. ' everybody
'; - $result.=' (Section -1 implies the students were not assigned a section.)
' if (grep /-1/,@$sections); + $result.=' (Section "no" implies the students were not assigned a section.)
' + if (grep /no/,@$sections); $result.='
 '."\n". ''."\n"; @@ -839,7 +1245,7 @@ sub editgrades { ''."\n". '
'."\n"; - foreach my $student ( sort(@{ $$classlist{'all '} }) ) { + foreach my $student ( sort(@{ $$classlist{'all'} }) ) { $result.=&setstudentgrade($url,$symb,$ENV{'request.course.id'},$student,@parts); }