--- loncom/interface/spreadsheet/lonspreadsheet.pm 2003/05/16 20:55:11 1.1 +++ loncom/interface/spreadsheet/lonspreadsheet.pm 2003/11/21 18:18:04 1.30 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.1 2003/05/16 20:55:11 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.30 2003/11/21 18:18:04 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -54,12 +54,16 @@ built-in functions. package Apache::lonspreadsheet; use strict; +use warnings FATAL=>'all'; +no warnings 'uninitialized'; use Apache::classcalc(); use Apache::studentcalc(); use Apache::assesscalc(); use Apache::Constants qw(:common :http); use Apache::lonnet; use Apache::lonhtmlcommon; +use Apache::lonlocal; +use Apache::loncoursedata(); use HTML::Entities(); ## @@ -68,8 +72,8 @@ use HTML::Entities(); sub textfield { my ($title,$name,$value)=@_; - return "\n

$title:
". - ''; + return "\n

$title:
". + ''; } sub hiddenfield { @@ -79,15 +83,118 @@ sub hiddenfield { sub selectbox { my ($title,$name,$value,%options)=@_; - my $selout="\n

$title:
".''; foreach (sort keys(%options)) { $selout.=''; } return $selout.''; } +sub file_dialogs { + my ($spreadsheet) = @_; + my $bgcolor = "#FFFFFF"; + my $sheettype = $spreadsheet->{'type'}; + my $result = ''; + my $message = ''; + ## + ## Deal with saving the spreadsheet + if ((exists($ENV{'form.save'}) || exists($ENV{'form.makedefault'})) && + exists($ENV{'form.savefilename'})) { + $spreadsheet->filename($ENV{'form.savefilename'}); + my $save_status = $spreadsheet->save(); + if ($save_status ne 'ok') { + $message .= "An error occurred while saving the spreadsheet". + "There error is:".$save_status; + } else { + $message .= "Spreadsheet saved as ".$spreadsheet->filename(); + } + } elsif (exists($ENV{'form.newformula'}) && + exists($ENV{'form.cell'}) && + $ENV{'form.cell'} ne '' ) { + ## + ## Make any requested modifications to the spreadsheet + $spreadsheet->modify_cell($ENV{'form.cell'}, + $ENV{'form.newformula'}); + $spreadsheet->save_tmp(); + # output that we are dealing with a temporary file + $result .=&hiddenfield('workcopy',$sheettype); + if ($ENV{'form.newformula'} !~ /^\s*$/) { + $message .=''. + ''. + '
'.&mt('Cell').' '.$ENV{'form.cell'}.' = 
'.$ENV{'form.newformula'}."
\n"; + } else { + $message .= &mt('Deleted contents of cell').' '.$ENV{'form.cell'}.'.'; + } + } + ## + ## Editing code + $result .=&hiddenfield('cell',''). + &hiddenfield('newformula',''); + ## + ## Create the save and load dialogs + my $filename = $spreadsheet->filename(); + my $truefilename = $filename; + if ($spreadsheet->is_default()) { + $filename = 'Default'; + } + my $save_dialog = ''. + ' '. + ''. + ''; + my $makedefault_dialog = ''; + # + my $link = '".&mt('Select Spreadsheet File').""; + my $load=&mt('Load:'); + my $load_dialog = < + + + + $link + +  + \n \n\n"; + # + $result .=< + File Dialogs + --> + + + + + + +
$load_dialog + + + +
$save_dialog
$makedefault_dialog
+
+ +END + return ($result,$message); +} + sub handler { my $r=shift; # @@ -99,12 +206,12 @@ sub handler { # Check the course homeserver $loaderror= &Apache::lonnet::overloaderror($r, $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); - if ($loaderror) { return $loaderror; } +# if ($loaderror) { return $loaderror; } # # HTML Header # if ($r->header_only) { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } @@ -118,11 +225,22 @@ sub handler { $r->uri.":opa:0:0:Cannot modify spreadsheet"; return HTTP_NOT_ACCEPTABLE; } + my $courseid = $ENV{'request.course.id'}; + # + # Do not allow students to continue if standard or external grading is in + # effect. + # + if ($ENV{'request.role'} =~ /^st\./) { + if ($ENV{'course.'.$courseid.'.grading'} eq 'standard' || + $ENV{'course.'.$courseid.'.grading'} eq 'external' ) { + return HTTP_NOT_ACCEPTABLE; + } + } # # Get query string for limited number of parameters # &Apache::loncommon::get_unprocessed_cgi - ($ENV{'QUERY_STRING'},['sname','sdomain','usymb','filename']); + ($ENV{'QUERY_STRING'},['sname','sdomain','usymb','filename','recalc']); # # Deal with restricted student permissions # @@ -142,25 +260,53 @@ sub handler { $name = $ENV{'form.sname'}; $domain = $ENV{'form.sdomain'}; } + ## + ## Check permissions + my $allowed_to_edit = &Apache::lonnet::allowed('mgr', + $ENV{'request.course.id'}); + # Only those instructors/tas/whatevers with complete access + # (not section restricted) are able to modify spreadsheets. + my $allowed_to_view = &Apache::lonnet::allowed('vgr', + $ENV{'request.course.id'}); + if (! $allowed_to_view) { + $allowed_to_view = &Apache::lonnet::allowed('vgr', + $ENV{'request.course.id'}.'/'.$ENV{'request.course.sec'}); + # Those who are restricted by section are allowed to view. + # The routines in lonstatistics which decide which students' + # will be shown take care of the restriction by section. + } + # + # Only those able to view others grades will be allowed to continue + # if they are not requesting their own. + if ($sheettype eq 'classcalc') { + if (! $allowed_to_view) { + $ENV{'user.error.msg'}= + $r->uri.":vgr:0:0:Access Permission Denied"; + return HTTP_NOT_ACCEPTABLE; + } + } + if ((($name ne $ENV{'user.name'} ) || + ($domain ne $ENV{'user.domain'})) && $sheettype ne 'classcalc') { + # Check that the student is in their section? + if (exists($ENV{'request.course.sec'}) && + $ENV{'request.course.sec'} ne '' ) { + my $stu_sec = &Apache::lonnet::usection($domain,$name, + $ENV{'request.course.id'}); + if ($stu_sec ne $ENV{'request.course.sec'}) { + $ENV{'user.error.msg'}= + $r->uri.":vgr:0:0:Requested student not in your section."; + return HTTP_NOT_ACCEPTABLE; + } + } + } + # # Open page, try to prevent browser cache. # - $r->content_type('text/html'); - $r->header_out('Cache-control','no-cache'); - $r->header_out('Pragma','no-cache'); + &Apache::loncommon::content_type($r,'text/html'); + &Apache::loncommon::no_cache($r); $r->send_http_header; - # - # Check user permissions - only those able to view others grades - # will be allowed to continue if they are not requesting their own. - if (($sheettype eq 'classcalc') || - ($name ne $ENV{'user.name'} ) || - ($domain ne $ENV{'user.domain'})) { - if (! &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { - $r->print('

Access Permission Denied

'. - ''); - return OK; - } - } + # # Header.... # @@ -169,9 +315,18 @@ sub handler { ## ## Spit out the javascript required for editing ## - if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) { + if ($allowed_to_edit) { + my %lt=( + 'ce' => 'Cell', + 'ac' => 'Accept', + 'dc' => 'Discard Changes' + ); + my $extra_javascript = + &Apache::loncommon::browser_and_searcher_javascript(); $r->print(< + ENDSCRIPT } @@ -216,17 +372,41 @@ ENDSCRIPT &hiddenfield('usymb' ,$ENV{'form.usymb'})); $r->rflush(); ## - ## Check permissions - my $editing_is_allowed = &Apache::lonnet::allowed('mgr', - $ENV{'request.course.id'}); - ## ## Determine the filename to use my $filename = undef; - if ($editing_is_allowed) { + if ($allowed_to_edit) { $filename = $ENV{'form.filename'} if (exists($ENV{'form.filename'})); # if (exists($ENV{'form.load'}) && exists($ENV{'form.loadfilename'})) { $filename = $ENV{'form.loadfilename'}; + $ENV{'form.workcopy'} = 'no'; + } + } + ## + ## Take care of "backdoor" spreadsheet expiration / recalc stuff + if ($allowed_to_edit && exists($ENV{'form.recalc'})) { + if (exists($ENV{'form.recalc'})) { + &Apache::loncoursedata::delete_caches($ENV{'requres.course.id'}); + } + if ($ENV{'form.recalc'} eq 'ilovewastingtime') { + &Apache::lonnet::logthis('ilovewastingtime'); + # expire ALL spreadsheets + &Apache::lonnet::expirespread('','','studentcalc'); + &Apache::lonnet::expirespread('','','assesscalc'); + } elsif ($ENV{'form.recalc'} =~ /^symb:/) { + # expire for all students on this symb + my ($symb) = ($ENV{'form.recalc'} =~ /^symb:(.*)$/); + &Apache::lonnet::logthis('symb = '.$symb); + &Apache::lonnet::expirespread('','','assesscalc',$symb); + &Apache::lonnet::expirespread('','','studentcalc'); + } elsif ($ENV{'form.recalc'} =~ /^student:/) { + # expire all assessment spreadsheets for this user + my ($sname,$sdom) = ($ENV{'form.recalc'}=~/^student:(.*):(.*)$/); + &Apache::lonnet::logthis('student = '.$sname.':'.$sdom); + if (defined($sname) && defined($sdom)) { + &Apache::lonnet::expirespread($sname,$sdom,'assesscalc'); + &Apache::lonnet::expirespread($sname,$sdom,'studentcalc'); + } } } ## @@ -237,88 +417,90 @@ ENDSCRIPT $spreadsheet = Apache::classcalc->new($name,$domain,$filename,undef); } elsif ($sheettype eq 'studentcalc') { $spreadsheet = Apache::studentcalc->new($name,$domain,$filename,undef); - } elsif ($sheettype eq 'assesscalc' && defined($symb)) { + } elsif ($sheettype eq 'assesscalc' && + defined($symb) && + $allowed_to_edit) { $spreadsheet = Apache::assesscalc->new($name,$domain,$filename,$symb); } else { - &Apache::lonnet::logthis('Unable to determine spreadsheet type'); + return HTTP_NOT_ACCEPTABLE; + } + if (! defined($spreadsheet)) { + # error error - run in circles, scream and shout return; } + $spreadsheet->initialize(); + # + # Output selector ## ## Editing/loading/saving - if ($editing_is_allowed) { - ## - ## Deal with saving the spreadsheet - if (exists($ENV{'form.save'}) && - exists($ENV{'form.savefilename'})) { - $spreadsheet->filename($ENV{'form.savefilename'}); - my $save_status = $spreadsheet->save(); - if ($save_status ne 'ok') { - $r->print("An error occurred while saving the spreadsheet". - "There error is:".$save_status); - } else { - $r->print("Spreadsheet saved as ".$ENV{'form.savefilename'}); + if ($allowed_to_edit) { + my ($html,$action_message) = &file_dialogs($spreadsheet); + if ($ENV{'form.makedefault'}) { + $spreadsheet->make_default(); + if ($action_message) { + $action_message .= '
'; } - } elsif (exists($ENV{'form.newformula'}) && - exists($ENV{'form.cell'}) && - $ENV{'form.cell'} ne '' ) { - ## - ## Make any requested modifications to the spreadsheet - $spreadsheet->modify_cell($ENV{'form.cell'}, - $ENV{'form.newformula'}); - $spreadsheet->save_tmp(); - # output that we are dealing with a temporary file - $r->print(&hiddenfield('workcopy',$sheettype)); - $r->print('
'.$ENV{'form.cell'}.' = '.
-                      $ENV{'form.newformula'}.'
'."\n"); - } - ## - ## Editing code - $r->print(&hiddenfield('cell',''). - &hiddenfield('newformula','')); - ## - ## Create the save and load dialogs - $filename = $spreadsheet->filename(); - $filename = '' if ($filename =~ /^default\.$sheettype/i); - $filename =~ s/_$sheettype$//; - my $save_dialog = - ' '. - ''; - my $makedefault_dialog = - ''; - # - my $load_dialog = - ''. - ''. + ''); + } + if ($allowed_to_view) { + $r->print(''. + &Apache::loncommon::help_open_topic("Spreadsheet_About", + 'Spreadsheet Help'). + ''); + } + if ($allowed_to_edit) { + $r->print(''. + &Apache::loncommon::help_open_topic("Spreadsheet_Editing", + 'Editing Help'). + ''); } + $r->print(''); # # Keep track of the filename $r->print(&hiddenfield('filename',$filename)); # - $r->print($spreadsheet->get_title()); - $r->print($spreadsheet->parent_link()); - if (defined($spreadsheet)) { + # Keep track of the number of times we have been called, sort of. + $r->print(&hiddenfield('not_first_run','whatever')); + # + if (exists($ENV{'form.not_first_run'}) || $sheettype ne 'classcalc') { + $r->print($spreadsheet->get_html_title()); + if ($allowed_to_view || $allowed_to_edit) { + $r->print($spreadsheet->parent_link()); + } + $r->rflush(); $spreadsheet->display($r); } $r->print('');