--- loncom/interface/Attic/lonspreadsheet.pm 2000/12/30 19:59:18 1.21 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/01/01 16:16:08 1.23 @@ -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; @@ -650,7 +651,19 @@ 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 @@ -684,7 +697,7 @@ sub tmpread { $fo{$name}=$value; } } - $fo{$nfield}=$nform; + if ($nfield) { $fo{$nfield}=$nform; } &setformulas($safeeval,%fo); } @@ -791,7 +804,67 @@ 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) { + $currentlist{&Apache::lonnet::unescape($name)}=1; + } + } 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}=$_; + } + } keys %currentlist; + + if ($changed) { &setformulas($safeeval,%f); } + + &setmaxrow($safeeval,$maxrow); + &setrowlabels($safeeval,%currentlist); + + } else { + return 'Could not access course data'; + } +} # ----------------------------------------------------------------- Update rows sub updaterows { @@ -1125,18 +1198,26 @@ 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 { &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)) { @@ -1151,7 +1232,22 @@ 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.'

'); + } + } + } # ------------------------------------------------ Write the modified worksheet &tmpwrite($sheetone,$r->dir_config('lonDaemons').'/tmp/', @@ -1159,13 +1255,22 @@ ENDSCRIPT # ----------------------------------------------------- Print user, course, etc unless ($reroute) { - $r->print(&hiddenfield('ufn',$ENV{'form.ufn'}). - "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(''. + '

'); + } + $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