--- loncom/interface/Attic/lonspreadsheet.pm 2000/12/30 17:13:54 1.20 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/01/01 20:25:57 1.25 @@ -2,7 +2,8 @@ # Spreadsheet/Grades Display Handler # # 11/11,11/15,11/27,12/04,12/05,12/06,12/07, -# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30 Gerd Kortemeyer +# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, +# 01/01/01 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -328,6 +329,20 @@ sub calc { return ''; } +sub templaterow { + my @cols=(); + $cols[0]='Template'; + map { + my $fm=$f{'template_'.$_}; + $fm=~s/[\'\"]/\&\#34;/g; + $cols[$#cols+1]="'template_$_','$fm'".'___eq___'.$fm; + } ('A','B','C','D','E','F','G','H','I','J','K','L','M', + 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', + 'a','b','c','d','e','f','g','h','i','j','k','l','m', + 'n','o','p','q','r','s','t','u','v','w','x','y','z'); + return @cols; +} + sub outrowassess { my $n=shift; my @cols=(); @@ -351,7 +366,7 @@ sub outrow { my $n=shift; my @cols=(); if ($n) { - $cols[0]=$rl{$f{'A'.$n}}.' stuff'; + $cols[0]=$rl{$f{'A'.$n}}; } else { $cols[0]='Export'; } @@ -480,8 +495,31 @@ sub exportrow { sub rown { my ($safeeval,$n)=@_; - my $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; - my $rowdata="\n$n"; + my $defaultbg; + my $rowdata=''; + unless ($n eq '-') { + $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; + } else { + $defaultbg='#E0FF'; + } + if ((($n-1)/25)==int(($n-1)/25)) { + my $what='Student'; + if (&gettype($safeeval) eq 'assesscalc') { + $what='Item'; + } elsif (&gettype($safeeval) eq 'studentcalc') { + $what='Assessment'; + } + $rowdata.="\n
". + ''; + map { + $rowdata.=''; + } ('A','B','C','D','E','F','G','H','I','J','K','L','M', + 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', + 'a','b','c','d','e','f','g','h','i','j','k','l','m', + 'n','o','p','q','r','s','t','u','v','w','x','y','z'); + $rowdata.=''; + } + $rowdata.="\n"; my $showf=0; my $proc; my $maxred; @@ -492,6 +530,7 @@ sub rown { $proc='&outrow'; $maxred=26; } + if ($n eq '-') { $proc='&templaterow'; $n=-1; } map { my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); @@ -516,7 +555,7 @@ sub rown { # ------------------------------------------------------------- Print out sheet sub outsheet { - my $safeeval=shift; + my ($r,$safeeval)=@_; my $maxred; my $realm; if (&gettype($safeeval) eq 'assesscalc') { @@ -530,7 +569,8 @@ sub outsheet { $realm='Course'; } my $maxyellow=52-$maxred; - my $tabledata='
 '.$what.''.$_.'
$n
'. + my $tabledata= + ''. ''. @@ -552,10 +592,12 @@ sub outsheet { $tabledata.=''; my $row; my $maxrow=&getmaxrow($safeeval); + $tabledata.=&rown($safeeval,'-'); + $r->print($tabledata); for ($row=0;$row<=$maxrow;$row++) { - $tabledata.=&rown($safeeval,$row); + $r->print(&rown($safeeval,$row)); } - $tabledata.='
'. $realm.'Import
'; + $r->print('
'); } @@ -565,7 +607,7 @@ sub outsheet { sub readsheet { my ($safeeval,$fn,$r)=@_; my %f=(); - unless ($fn) { + if (($fn eq '') || ($fn=~/^default\_/)) { my $sheetxml=''; { my $fh; @@ -629,14 +671,26 @@ sub writesheet { &getfilename($safeeval).':'. $sheetdata, $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); - } + if ($reply eq 'ok') { + return &Apache::lonnet::reply('put:'. + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'. + &gettype($safeeval).'_spreadsheets:'. + &Apache::lonnet::escape(&getfilename($safeeval)).'='. + $ENV{'user.name'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + } else { + return $reply; + } + } + return 'unauthorized'; } # ----------------------------------------------- Make a temp copy of the sheet sub tmpwrite { my ($safeeval,$tmpdir,$symb)=@_; - my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval); + my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval); $fn=~s/\W/\_/g; $fn=$tmpdir.$fn.'.tmp'; my $fh; @@ -649,7 +703,7 @@ sub tmpwrite { sub tmpread { my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_; - my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval); + my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval); $fn=~s/\W/\_/g; $fn=$tmpdir.$fn.'.tmp'; my $fh; @@ -663,7 +717,7 @@ sub tmpread { $fo{$name}=$value; } } - $fo{$nfield}=$nform; + if ($nfield) { $fo{$nfield}=$nform; } &setformulas($safeeval,%fo); } @@ -770,7 +824,86 @@ sub parmval { } +# ---------------------------------------------- Update rows for course listing + +sub updatestudentrows { + my $safeeval=shift; + my $cid=$ENV{'request.course.id'}; + my $classlst=&Apache::lonnet::reply + ('dump:'.$ENV{'course.'.$cid.'.domain'}.':'. + $ENV{'course.'.$cid.'.num'}.':classlist', + $ENV{'course.'.$cid.'.home'}); + my %currentlist=(); + 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 $rowlabel=''; + $name=&Apache::lonnet::unescape($name); + my ($cname,$cdom)=split(/\:/,$name); + my $csec= + &Apache::lonnet::usection($cdom,$cname,$ENV{'request.course.id'}); + if ($csec==-1) { + $rowlabel='Data not available: '.$name. + ''; + } else { + my %reply=&Apache::lonnet::idrget($cdom,$cname); + my $reply=&Apache::lonnet::reply('get:'.$cdom.':'.$cname. + ':environment:firstname&middlename&lastname&generation', + &Apache::lonnet::homeserver($cname,$cdom)); + $rowlabel=$csec.' '.$reply{$cname}.'
'; + map { + $rowlabel.=&Apache::lonnet::unescape($_).' '; + } split(/\&/,$reply); + } + + $currentlist{&Apache::lonnet::unescape($name)}=$rowlabel; + } + } split(/\&/,$classlst); +# +# -------------------- Find discrepancies between the course row table and this +# + my %f=&getformulas($safeeval); + my $changed=0; + + my $maxrow=0; + my %existing=(); + +# ----------------------------------------------------------- Now obsolete rows + map { + if ($_=~/^A(\d+)/) { + $maxrow=($1>$maxrow)?$1:$maxrow; + $existing{$f{$_}}=1; + unless ((defined($currentlist{$f{$_}})) || (!$1)) { + $f{$_}='!!! Obsolete'; + $changed=1; + } + } + } keys %f; + +# -------------------------------------------------------- New and unknown keys + + map { + unless ($existing{$_}) { + $changed=1; + $maxrow++; + $f{'A'.$maxrow}=$_; + } + } sort keys %currentlist; + + if ($changed) { &setformulas($safeeval,%f); } + + &setmaxrow($safeeval,$maxrow); + &setrowlabels($safeeval,%currentlist); + } else { + return 'Could not access course data'; + } +} # ----------------------------------------------------------------- Update rows sub updaterows { @@ -869,7 +1002,7 @@ sub updaterows { } } -# --------------------------------------------------- Load data for one student +# ------------------------------------------------ Load data for one assessment sub rowazstudent { my $safeeval=shift; @@ -881,7 +1014,7 @@ sub rowazstudent { unless ($f{$_}=~/^\!/) { my @assessdata=split(/\_\_\_\;\_\_\_/, &Apache::lonnet::ssi( - '/res/msu/korte/junk.assesscalc',('utarget' => 'export', + '/adm/assesscalc',('utarget' => 'export', 'uname' => $uname, 'udom' => $udom, 'usymb' => $f{$_}))); @@ -903,6 +1036,41 @@ sub rowazstudent { &setconstants($safeeval,%c); } +# --------------------------------------------------- Load data for one student + +sub rowazclass { + my $safeeval=shift; + my %c=(); + my %f=&getformulas($safeeval); + map { + if ($_=~/^A(\d+)/) { + my $row=$1; + unless ($f{$_}=~/^\!/) { + my ($tname,$tdom)=split(/\:/,$_); + my @assessdata=split(/\_\_\_\;\_\_\_/, + &Apache::lonnet::ssi( + '/adm/studentcalc',('utarget' => 'export', + 'uname' => $tname, + 'udom' => $tdom, + 'usymb' => $f{$_}))); + my $index=0; + map { + if ($assessdata[$index]) { + $c{$_.$row}=$assessdata[$index]; + unless ($_ eq 'A') { + $f{$_.$row}='import'; + } + } + $index++; + } ('A','B','C','D','E','F','G','H','I','J','K','L','M', + 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); + } + } + } keys %f; + &setformulas($safeeval,%f); + &setconstants($safeeval,%c); +} + # ------------------------------------------------ Load data for one assessment sub rowaassess { @@ -1086,15 +1254,16 @@ sub handler { ENDSCRIPT $r->print(''. + ''. + '

LON-CAPA Spreadsheet

'. '
'. &hiddenfield('uname',$ENV{'form.uname'}). &hiddenfield('udom',$ENV{'form.udom'}). &hiddenfield('usymb',$ENV{'form.usymb'}). - &hiddenfield('ufn',$ENV{'form.ufn'}). &hiddenfield('unewfield',''). &hiddenfield('unewformula','')); } - + $r->rflush(); # ---------------------------------------- Read new sheet or modified worksheet my $sheetone=initsheet(); @@ -1103,17 +1272,40 @@ ENDSCRIPT if ($ENV{'form.unewfield'}) { $r->print('

Modified Workcopy

'); $ENV{'form.unewformula'}=~s/\'/\"/g; - $r->print('New formula: '.$ENV{'form.unewfield'}.'='. - $ENV{'form.unewformula'}.'
'); + $r->print('

New formula: '.$ENV{'form.unewfield'}.'='. + $ENV{'form.unewformula'}.'

'); &setfilename($sheetone,$ENV{'form.ufn'}); &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', $ENV{'form.usymb'}, $ENV{'form.unewfield'},$ENV{'form.unewformula'}); + } elsif ($ENV{'form.saveas'}) { + &setfilename($sheetone,$ENV{'form.ufn'}); + &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', + $ENV{'form.usymb'}); } else { + unless ($ENV{'form.ufn'}) { + my $reply=&Apache::lonnet::reply('get:'. + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}. + ':environment:spreadsheet_default_'. + &gettype($sheetone), + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + unless ($reply=~/^error\:/) { + $ENV{'form.ufn'}=$reply; + unless ($reroute) { + $r->print('

Using customized default spreadsheet

'); + } + } + } &readsheet($sheetone,$ENV{'form.ufn'},$r); + $ENV{'form.ufn'}=&getfilename($sheetone); } -# --------------------------------------------- See if all import rows uptodate + if (&gettype($sheetone) eq 'classcalc') { +# ---------------------------------- For course view: get courselist and update + &updatestudentrows($sheetone); + } else { +# ----------------- For assessment and student: See if all import rows uptodate if (tie(%parmhash,'GDBM_File', $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640)) { @@ -1128,7 +1320,34 @@ ENDSCRIPT $r->print('

'. 'Could not initialize import fields (not in a course)

'); } - + } +# ---------------------------------------------------- See if something to save + if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + my $fname=''; + if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { + $fname=~s/\W/\_/g; + if ($fname eq 'default') { $fname='course_default'; } + $fname.='_'.&gettype($sheetone); + &setfilename($sheetone,$fname); + $ENV{'form.ufn'}=$fname; + my $reply=&writesheet($sheetone); + unless ($reroute) { + $r->print('

Saving spreadsheet: '.$reply.'

'); + } + if ($ENV{'form.makedefufn'}) { + my $reply=&Apache::lonnet::reply('put:'. + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}. + ':environment:spreadsheet_default_'. + &gettype($sheetone).'='. + &Apache::lonnet::escape($fname), + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + unless ($reroute) { + $r->print('

Making default spreadsheet: '.$reply.'

'); + } + } + } + } # ------------------------------------------------ Write the modified worksheet &tmpwrite($sheetone,$r->dir_config('lonDaemons').'/tmp/', @@ -1136,12 +1355,23 @@ ENDSCRIPT # ----------------------------------------------------- Print user, course, etc unless ($reroute) { - $r->print("User '$uname' at domain '$udom' for '". - $ENV{'course.'.$ENV{'request.course.id'}.'.description'}."'"); + if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + my $fname=$ENV{'form.ufn'}; + $fname=~s/\_[^\_]+$//; + if ($fname eq 'default') { $fname='course_default'; } + $r->print(''. + ' (make default: )

'); + } + $r->print(&hiddenfield('ufn',$ENV{'form.ufn'})); + unless (&gettype($sheetone) eq 'classcalc') { + $r->print('
User: '.$uname.'
Domain: '.$udom); + } + $r->print('

'. + $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'

'); if ($csec) { - $r->print(", group/section '$csec'"); + $r->print('

Group/Section: '.$csec.'

'); } - $r->print("
\n"); } # -------------------------------------------------------- Import and calculate @@ -1157,7 +1387,7 @@ ENDSCRIPT # ------------------------------------------------------- Print or export sheet unless ($reroute) { - $r->print(&outsheet($sheetone)); + &outsheet($r,$sheetone); $r->print('
'); } else {