--- loncom/interface/spreadsheet/lonspreadsheet.pm 2003/06/16 13:51:46 1.9 +++ loncom/interface/spreadsheet/lonspreadsheet.pm 2004/02/24 21:03:09 1.31.2.1 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.9 2003/06/16 13:51:46 www Exp $ +# $Id: lonspreadsheet.pm,v 1.31.2.1 2004/02/24 21:03:09 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,11 +83,11 @@ sub hiddenfield { sub selectbox { my ($title,$name,$value,%options)=@_; - my $selout="\n

$title:
".''; foreach (sort keys(%options)) { $selout.=''; } return $selout.''; } @@ -93,18 +97,18 @@ sub file_dialogs { my $bgcolor = "#FFFFFF"; my $sheettype = $spreadsheet->{'type'}; my $result = ''; + my $message = ''; ## ## Deal with saving the spreadsheet - if (exists($ENV{'form.save'}) && + 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') { - $result .= "An error occurred while saving the spreadsheet". + $message .= "An error occurred while saving the spreadsheet". "There error is:".$save_status; - return $result; } else { - $result .= "Spreadsheet saved as ".$ENV{'form.savefilename'}; + $message .= "Spreadsheet saved as ".$spreadsheet->filename(); } } elsif (exists($ENV{'form.newformula'}) && exists($ENV{'form.cell'}) && @@ -116,8 +120,13 @@ sub file_dialogs { $spreadsheet->save_tmp(); # output that we are dealing with a temporary file $result .=&hiddenfield('workcopy',$sheettype); - $result .='

'.$ENV{'form.cell'}.' = '.
-                  $ENV{'form.newformula'}."
\n"; + 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 @@ -126,23 +135,26 @@ sub file_dialogs { ## ## Create the save and load dialogs my $filename = $spreadsheet->filename(); - $filename = 'Default' if ($filename =~ /^default\.$sheettype/i); - $filename =~ s/_$sheettype$//; + my $truefilename = $filename; + if ($spreadsheet->is_default()) { + $filename = 'Default'; + } my $save_dialog = ''. - ' '. + ' '. ''. + $truefilename.'" />'. ''; my $makedefault_dialog = ''; + 'value="'.&mt('Save as & Make This Sheet the Default').'"/>'; # my $link = 'Select Spreadsheet File"; + "('sheet','loadfilename','spreadsheet')\">".&mt('Select Spreadsheet File').""; + my $load=&mt('Load:'); my $load_dialog = < - + - + $link   @@ -150,23 +162,20 @@ sub file_dialogs { END my $default_filename_set = 0; foreach my $sheetfilename ($spreadsheet->othersheets()) { - $sheetfilename =~ s/_$sheettype$//; - $load_dialog .= ' '."\n"; - } else { - $load_dialog .= ''. - "\n"; - } - $load_dialog .= " \n\n"; + $load_dialog .= "\n \n\n"; # $result .=< + File Dialogs + --> @@ -179,8 +188,11 @@ END
+ END - return $result; + return ($result,$message); } sub handler { @@ -199,7 +211,7 @@ sub handler { # HTML Header # if ($r->header_only) { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } @@ -213,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 # @@ -233,36 +256,59 @@ sub handler { $symb = $ENV{'form.usymb'} if (exists($ENV{'form.usymb'})); my $name = $ENV{'user.name'}; my $domain = $ENV{'user.domain'}; - if (exists($ENV{'form.sname'})) { + if (exists($ENV{'form.sname'}) && $ENV{'form.sname'} ne '') { $name = $ENV{'form.sname'}; $domain = $ENV{'form.sdomain'}; } - # - # 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'); - $r->send_http_header; + $ENV{'form.sname'} = $name; + $ENV{'form.sdomain'} = $domain; ## ## 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') || - ($name ne $ENV{'user.name'} ) || - ($domain ne $ENV{'user.domain'})) { + if ($sheettype eq 'classcalc') { if (! $allowed_to_view) { - $r->print('

Access Permission Denied

'. - ''); - return OK; + $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. + # + &Apache::loncommon::content_type($r,'text/html'); + &Apache::loncommon::no_cache($r); + $r->send_http_header; + # # Header.... # @@ -272,11 +318,16 @@ sub handler { ## Spit out the javascript required for editing ## 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 } @@ -333,6 +385,33 @@ ENDSCRIPT } } ## + ## 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'); + } + } + } + ## ## Make the spreadsheet &Apache::Spreadsheet::initialize_spreadsheet_package(); my $spreadsheet = undef; @@ -354,18 +433,61 @@ ENDSCRIPT $spreadsheet->initialize(); # # Output selector - $r->print('
'); ## ## Editing/loading/saving if ($allowed_to_edit) { + my ($html,$action_message) = &file_dialogs($spreadsheet); + if ($ENV{'form.makedefault'}) { + $spreadsheet->make_default(); + if ($action_message) { + $action_message .= '
'; + } + $action_message .= &mt('Made this spreadsheet the default'); + if ($sheettype eq 'classcalc') { + $action_message .= ' '.&mt('for the course'); + } elsif ($sheettype eq 'studentcalc') { + $action_message .= ' '.&mt('for all students'); + } elsif ($sheettype eq 'assesscalc') { + $action_message .= ' '.&mt('for all assessments'); + } + $action_message .= '.'; + } $r->print(''. - '
'.$spreadsheet->html_header().''. - &file_dialogs($spreadsheet)."
\n"); + ''.$html."\n"); + if ($action_message ne '') { + $r->print(< +Last Action: +   + $action_message + + +END + } $r->rflush(); } else { $r->print('
'.$spreadsheet->html_header(). "
\n"); } + $r->rflush(); + # + $r->print(""); + $r->print(''); + if ($allowed_to_view) { + $r->print(''); + } + if ($allowed_to_edit) { + $r->print(''); + } + $r->print('
'. + ''. + &Apache::loncommon::help_open_topic("Spreadsheet_About", + 'Spreadsheet Help'). + ''. + &Apache::loncommon::help_open_topic("Spreadsheet_Editing", + 'Editing Help'). + '
'); # # Keep track of the filename $r->print(&hiddenfield('filename',$filename)); @@ -378,9 +500,8 @@ ENDSCRIPT if ($allowed_to_view || $allowed_to_edit) { $r->print($spreadsheet->parent_link()); } + $r->rflush(); $spreadsheet->display($r); - } else { - $r->print("

Make your selections and bonk the 'update display' button

"); } $r->print(''); return OK; 500 Internal Server Error

Internal Server Error

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.