version 1.39, 2004/10/12 20:51:54
|
version 1.49, 2006/10/31 18:35:51
|
Line 100 sub file_dialogs {
|
Line 100 sub file_dialogs {
|
my $message = ''; |
my $message = ''; |
## |
## |
## Deal with saving the spreadsheet |
## Deal with saving the spreadsheet |
if ((exists($ENV{'form.save'}) || exists($ENV{'form.makedefault'})) && |
$spreadsheet->check_formulas_loaded(); |
exists($ENV{'form.savefilename'})) { |
if ((exists($env{'form.save'}) || exists($env{'form.makedefault'})) && |
$spreadsheet->filename($ENV{'form.savefilename'}); |
exists($env{'form.savefilename'})) { |
|
$spreadsheet->filename($env{'form.savefilename'}); |
my $save_status = $spreadsheet->save(); |
my $save_status = $spreadsheet->save(); |
if ($save_status ne 'ok') { |
if ($save_status ne 'ok') { |
$message .= "An error occurred while saving the spreadsheet". |
$message .= "An error occurred while saving the spreadsheet". |
Line 110 sub file_dialogs {
|
Line 111 sub file_dialogs {
|
} else { |
} else { |
$message .= "Spreadsheet saved as ".$spreadsheet->filename(); |
$message .= "Spreadsheet saved as ".$spreadsheet->filename(); |
} |
} |
} elsif (exists($ENV{'form.newformula'}) && |
} elsif (exists($env{'form.newformula'}) && |
exists($ENV{'form.cell'}) && |
exists($env{'form.cell'}) && |
$ENV{'form.cell'} ne '' ) { |
$env{'form.cell'} ne '' ) { |
## |
## |
## Make any requested modifications to the spreadsheet |
## Make any requested modifications to the spreadsheet |
$spreadsheet->modify_cell($ENV{'form.cell'}, |
$spreadsheet->modify_cell($env{'form.cell'}, |
$ENV{'form.newformula'}); |
$env{'form.newformula'}); |
$spreadsheet->save_tmp(); |
$spreadsheet->save_tmp(); |
# output that we are dealing with a temporary file |
# output that we are dealing with a temporary file |
$result .=&hiddenfield('workcopy',$sheettype); |
$result .=&hiddenfield('workcopy',$sheettype); |
if ($ENV{'form.newformula'} !~ /^\s*$/) { |
if ($env{'form.newformula'} !~ /^\s*$/) { |
$message .='<table><tr>'. |
$message .='<table><tr>'. |
'<td valign="top"><pre>'.&mt('Cell').' '.$ENV{'form.cell'}.' = </pre></td>'. |
'<td valign="top"><pre>'.&mt('Cell').' '.$env{'form.cell'}.' = </pre></td>'. |
'<td><pre>'.$ENV{'form.newformula'}."</pre></td></tr></table>\n"; |
'<td><pre>'.$env{'form.newformula'}."</pre></td></tr></table>\n"; |
} else { |
} else { |
$message .= &mt('Deleted contents of cell').' '.$ENV{'form.cell'}.'.'; |
$message .= &mt('Deleted contents of cell').' '.$env{'form.cell'}.'.'; |
} |
} |
} |
} |
## |
## |
Line 205 sub handler {
|
Line 206 sub handler {
|
if ($loaderror) { return $loaderror; } |
if ($loaderror) { return $loaderror; } |
# Check the course homeserver |
# Check the course homeserver |
$loaderror= &Apache::lonnet::overloaderror($r, |
$loaderror= &Apache::lonnet::overloaderror($r, |
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
$env{'course.'.$env{'request.course.id'}.'.home'}); |
# if ($loaderror) { return $loaderror; } |
# if ($loaderror) { return $loaderror; } |
# |
# |
# HTML Header |
# HTML Header |
Line 219 sub handler {
|
Line 220 sub handler {
|
# Roles Checking |
# Roles Checking |
# |
# |
# Needs to be in a course |
# Needs to be in a course |
if (! $ENV{'request.course.fn'}) { |
if (! $env{'request.course.fn'}) { |
# Not in a course, or not allowed to modify parms |
# Not in a course, or not allowed to modify parms |
$ENV{'user.error.msg'}= |
$env{'user.error.msg'}= |
$r->uri.":opa:0:0:Cannot modify spreadsheet"; |
$r->uri.":opa:0:0:Cannot modify spreadsheet"; |
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
my $courseid = $ENV{'request.course.id'}; |
my $courseid = $env{'request.course.id'}; |
# |
# |
# Do not allow students to continue if standard or external grading is in |
# Do not allow students to continue if standard or external grading is in |
# effect. |
# effect. |
# |
# |
if ($ENV{'request.role'} =~ /^st\./) { |
if ($env{'request.role'} =~ /^st\./) { |
if ($ENV{'course.'.$courseid.'.grading'} eq 'standard' || |
if ($env{'course.'.$courseid.'.grading'} eq 'standard' || |
$ENV{'course.'.$courseid.'.grading'} eq 'external' ) { |
$env{'course.'.$courseid.'.grading'} eq 'external' ) { |
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
} |
} |
Line 245 sub handler {
|
Line 246 sub handler {
|
# |
# |
# Deal with restricted student permissions |
# Deal with restricted student permissions |
# |
# |
if ($ENV{'request.role'} =~ /^st\./) { |
if ($env{'request.role'} =~ /^st\./) { |
delete $ENV{'form.cell'} if (exists($ENV{'form.cell'})); |
delete $env{'form.cell'} if (exists($env{'form.cell'})); |
delete $ENV{'form.newformula'} if (exists($ENV{'form.newformula'})); |
delete $env{'form.newformula'} if (exists($env{'form.newformula'})); |
} |
} |
# |
# |
# Determine basic information about the spreadsheet |
# Determine basic information about the spreadsheet |
my ($sheettype) = ($r->uri=~/\/(\w+)$/); |
my ($sheettype) = ($r->uri=~/\/(\w+)$/); |
# |
# |
my $symb = undef; |
my $symb = undef; |
$symb = $ENV{'form.usymb'} if (exists($ENV{'form.usymb'})); |
$symb = $env{'form.usymb'} if (exists($env{'form.usymb'})); |
my $name = $ENV{'user.name'}; |
my $name = $env{'user.name'}; |
my $domain = $ENV{'user.domain'}; |
my $domain = $env{'user.domain'}; |
if (exists($ENV{'form.sname'}) && $ENV{'form.sname'} ne '') { |
if (exists($env{'form.sname'}) && $env{'form.sname'} ne '') { |
$name = $ENV{'form.sname'}; |
$name = $env{'form.sname'}; |
$domain = $ENV{'form.sdomain'}; |
$domain = $env{'form.sdomain'}; |
|
} |
|
$env{'form.sname'} = $name; |
|
$env{'form.sdomain'} = $domain; |
|
my $section = &Apache::lonnet::getsection($domain,$name, |
|
$env{'request.course.id'}); |
|
my @groups; |
|
if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain)) { |
|
@groups = &Apache::lonnet::sort_course_groups($env{'request.course.id'}, |
|
split(':',$env{'request.course.groups'})); |
|
} else { |
|
@groups = &Apache::lonnet::get_users_groups($domain,$name, |
|
$env{'request.course.id'}); |
} |
} |
$ENV{'form.sname'} = $name; |
|
$ENV{'form.sdomain'} = $domain; |
|
## |
## |
## Check permissions |
## Check permissions |
my $allowed_to_edit = &Apache::lonnet::allowed('mgr', |
my $allowed_to_edit = &Apache::lonnet::allowed('mgr', |
$ENV{'request.course.id'}); |
$env{'request.course.id'}); |
# Only those instructors/tas/whatevers with complete access |
# Only those instructors/tas/whatevers with complete access |
# (not section restricted) are able to modify spreadsheets. |
# (not section restricted) are able to modify spreadsheets. |
my $allowed_to_view = &Apache::lonnet::allowed('vgr', |
my $allowed_to_view = &Apache::lonnet::allowed('vgr', |
$ENV{'request.course.id'}); |
$env{'request.course.id'}); |
if (! $allowed_to_view) { |
if (! $allowed_to_view) { |
$allowed_to_view = &Apache::lonnet::allowed('vgr', |
$allowed_to_view = &Apache::lonnet::allowed('vgr', |
$ENV{'request.course.id'}.'/'.$ENV{'request.course.sec'}); |
$env{'request.course.id'}.'/'.$env{'request.course.sec'}); |
# Those who are restricted by section are allowed to view. |
# Those who are restricted by section are allowed to view. |
# The routines in lonstatistics which decide which students' |
# The routines in lonstatistics which decide which students' |
# will be shown take care of the restriction by section. |
# will be shown take care of the restriction by section. |
Line 283 sub handler {
|
Line 295 sub handler {
|
# if they are not requesting their own. |
# if they are not requesting their own. |
if ($sheettype eq 'classcalc') { |
if ($sheettype eq 'classcalc') { |
if (! $allowed_to_view) { |
if (! $allowed_to_view) { |
$ENV{'user.error.msg'}= |
$env{'user.error.msg'}= |
$r->uri.":vgr:0:0:Access Permission Denied"; |
$r->uri.":vgr:0:0:Access Permission Denied"; |
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
} |
} |
if ((($name ne $ENV{'user.name'} ) || |
if ((($name ne $env{'user.name'} ) || |
($domain ne $ENV{'user.domain'})) && $sheettype ne 'classcalc') { |
($domain ne $env{'user.domain'})) && $sheettype ne 'classcalc') { |
# Check that the student is in their section? |
# Check that the student is in their section? |
if (exists($ENV{'request.course.sec'}) && |
if (exists($env{'request.course.sec'}) && |
$ENV{'request.course.sec'} ne '' ) { |
$env{'request.course.sec'} ne '' ) { |
my $stu_sec = &Apache::lonnet::getsection($domain,$name, |
my $stu_sec = &Apache::lonnet::getsection($domain,$name, |
$ENV{'request.course.id'}); |
$env{'request.course.id'}); |
if ($stu_sec ne $ENV{'request.course.sec'}) { |
if ($stu_sec ne $env{'request.course.sec'}) { |
$ENV{'user.error.msg'}= |
$env{'user.error.msg'}= |
$r->uri.":vgr:0:0:Requested student not in your section."; |
$r->uri.":vgr:0:0:Requested student not in your section."; |
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
Line 313 sub handler {
|
Line 325 sub handler {
|
# |
# |
# Header.... |
# Header.... |
# |
# |
$r->print('<html><head><title>LON-CAPA Spreadsheet</title>'); |
|
my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); |
my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); |
## |
## |
## Spit out the javascript required for editing |
## Spit out the javascript required for editing |
## |
## |
|
my $js; |
if ($allowed_to_edit) { |
if ($allowed_to_edit) { |
my %lt=( |
my %lt=( |
'ce' => 'Cell', |
'ce' => 'Cell', |
Line 326 sub handler {
|
Line 338 sub handler {
|
); |
); |
my $extra_javascript = |
my $extra_javascript = |
&Apache::loncommon::browser_and_searcher_javascript(); |
&Apache::loncommon::browser_and_searcher_javascript(); |
$r->print(<<ENDSCRIPT); |
|
|
my $cell_edit_start = |
|
&Apache::loncommon::start_page('Cell Edit Window',undef, |
|
{'only_body' => 1, |
|
'js_ready' => 1,}); |
|
my $cell_edit_end = |
|
&Apache::loncommon::end_page({'js_ready' => 1,}); |
|
|
|
$js = <<ENDSCRIPT; |
<script type="text/javascript"> |
<script type="text/javascript"> |
//<!-- |
//<!-- |
$extra_javascript |
$extra_javascript |
Line 337 sub handler {
|
Line 357 sub handler {
|
var edit_text = ''; |
var edit_text = ''; |
// cellformula may contain less-than and greater-than symbols, so |
// cellformula may contain less-than and greater-than symbols, so |
// we need to escape them? |
// we need to escape them? |
edit_text +='<html><head><title>Cell Edit Window</title></head><body>'; |
edit_text +='$cell_edit_start'; |
edit_text += '<form name="editwinform">'; |
edit_text += '<form name="editwinform">'; |
edit_text += '<center><h3>$lt{'ce'} '+cellname+'</h3>'; |
edit_text += '<center><h3>$lt{'ce'} '+cellname+'</h3>'; |
edit_text += '<textarea name="newformula" cols="60" rows="12"'; |
edit_text += '<textarea name="newformula" cols="60" rows="12"'; |
Line 355 sub handler {
|
Line 375 sub handler {
|
edit_text += '<input type="button" name="abort" '; |
edit_text += '<input type="button" name="abort" '; |
edit_text += 'value="$lt{'dc'}"'; |
edit_text += 'value="$lt{'dc'}"'; |
edit_text += ' onClick="javascript:self.close()" />'; |
edit_text += ' onClick="javascript:self.close()" />'; |
edit_text += '</center></body></html>'; |
edit_text += '</center>$cell_edit_end'; |
|
|
if (editwin != null && !(editwin.closed) ) { |
if (editwin != null && !(editwin.closed) ) { |
editwin.close(); |
editwin.close(); |
Line 375 ENDSCRIPT
|
Line 395 ENDSCRIPT
|
text => 'Spreadsheet', |
text => 'Spreadsheet', |
faq => 134, |
faq => 134, |
bug => 'Spreadsheet'}); |
bug => 'Spreadsheet'}); |
$r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet'). |
$r->print(&Apache::loncommon::start_page('Grades Spreadsheet',$js). |
&Apache::lonhtmlcommon::breadcrumbs(undef,'Spreadsheet'). |
&Apache::lonhtmlcommon::breadcrumbs('Spreadsheet', |
|
'Spreadsheet_About'). |
'<form action="'.$r->uri.'" name="sheet" method="post">'); |
'<form action="'.$r->uri.'" name="sheet" method="post">'); |
$r->print(&hiddenfield('sname' ,$ENV{'form.sname'}). |
$r->print(&hiddenfield('sname' ,$env{'form.sname'}). |
&hiddenfield('sdomain',$ENV{'form.sdomain'}). |
&hiddenfield('sdomain',$env{'form.sdomain'}). |
&hiddenfield('usymb' ,$ENV{'form.usymb'})); |
&hiddenfield('usymb' ,$env{'form.usymb'})); |
$r->rflush(); |
$r->rflush(); |
## |
## |
## Determine the filename to use |
## Determine the filename to use |
my $filename = undef; |
my $filename = undef; |
if ($allowed_to_edit) { |
if ($allowed_to_edit) { |
$filename = $ENV{'form.filename'} if (exists($ENV{'form.filename'})); |
$filename = $env{'form.filename'} if (exists($env{'form.filename'})); |
# |
# |
if (exists($ENV{'form.load'}) && exists($ENV{'form.loadfilename'})) { |
if (exists($env{'form.load'}) && exists($env{'form.loadfilename'})) { |
$filename = $ENV{'form.loadfilename'}; |
$filename = $env{'form.loadfilename'}; |
$ENV{'form.workcopy'} = 'no'; |
$env{'form.workcopy'} = 'no'; |
} |
} |
} |
} |
## |
## |
## Take care of "backdoor" spreadsheet expiration / recalc stuff |
## Take care of "backdoor" spreadsheet expiration / recalc stuff |
if ($allowed_to_edit && exists($ENV{'form.recalc'})) { |
if ($allowed_to_edit && exists($env{'form.recalc'})) { |
if (exists($ENV{'form.recalc'})) { |
if (exists($env{'form.recalc'})) { |
&Apache::loncoursedata::delete_caches($ENV{'requres.course.id'}); |
&Apache::loncoursedata::delete_caches($env{'requres.course.id'}); |
} |
} |
if ($ENV{'form.recalc'} eq 'ilovewastingtime') { |
if ($env{'form.recalc'} eq 'ilovewastingtime') { |
&Apache::lonnet::logthis('spreadsheet expired: entire course'); |
&Apache::lonnet::logthis('spreadsheet expired: entire course'); |
# expire ALL spreadsheets |
# expire ALL spreadsheets |
&Apache::lonnet::expirespread('','','studentcalc'); |
&Apache::lonnet::expirespread('','','studentcalc'); |
Line 407 ENDSCRIPT
|
Line 428 ENDSCRIPT
|
$r->print('<h3>'. |
$r->print('<h3>'. |
&mt('Expired spreadsheet caches for all students'). |
&mt('Expired spreadsheet caches for all students'). |
'</h3>'); |
'</h3>'); |
} elsif ($ENV{'form.recalc'} =~ /^symb:/) { |
} elsif ($env{'form.recalc'} =~ /^symb:/) { |
# expire for all students on this symb |
# expire for all students on this symb |
my ($symb) = ($ENV{'form.recalc'} =~ /^symb:(.*)$/); |
my ($symb) = ($env{'form.recalc'} =~ /^symb:(.*)$/); |
&Apache::lonnet::logthis('spreadsheet expired: symb = '.$symb); |
&Apache::lonnet::logthis('spreadsheet expired: symb = '.$symb); |
&Apache::lonnet::expirespread('','','assesscalc',$symb); |
&Apache::lonnet::expirespread('','','assesscalc',$symb); |
&Apache::lonnet::expirespread('','','studentcalc'); |
&Apache::lonnet::expirespread('','','studentcalc'); |
Line 417 ENDSCRIPT
|
Line 438 ENDSCRIPT
|
&mt('Expired spreadsheet caches for all students for symb [_1]', |
&mt('Expired spreadsheet caches for all students for symb [_1]', |
$symb). |
$symb). |
'</h3>'); |
'</h3>'); |
} elsif ($ENV{'form.recalc'} =~ /^student:/) { |
} elsif ($env{'form.recalc'} =~ /^student:/) { |
# expire all assessment spreadsheets for this user |
# expire all assessment spreadsheets for this user |
my ($sname,$sdom) = ($ENV{'form.recalc'}=~/^student:(.*):(.*)$/); |
my ($sname,$sdom) = ($env{'form.recalc'}=~/^student:(.*):(.*)$/); |
&Apache::lonnet::logthis('spreadsheet expired: student = '. |
&Apache::lonnet::logthis('spreadsheet expired: student = '. |
$sname.'@'.$sdom); |
$sname.'@'.$sdom); |
if (defined($sname) && defined($sdom)) { |
if (defined($sname) && defined($sdom)) { |
Line 437 ENDSCRIPT
|
Line 458 ENDSCRIPT
|
&Apache::Spreadsheet::initialize_spreadsheet_package(); |
&Apache::Spreadsheet::initialize_spreadsheet_package(); |
my $spreadsheet = undef; |
my $spreadsheet = undef; |
if ($sheettype eq 'classcalc') { |
if ($sheettype eq 'classcalc') { |
$spreadsheet = Apache::classcalc->new($name,$domain,$filename,undef); |
$spreadsheet = Apache::classcalc->new($name,$domain,$filename,undef, |
|
$section,\@groups); |
} elsif ($sheettype eq 'studentcalc') { |
} elsif ($sheettype eq 'studentcalc') { |
$spreadsheet = Apache::studentcalc->new($name,$domain,$filename,undef); |
$spreadsheet = Apache::studentcalc->new($name,$domain,$filename,undef, |
|
$section,\@groups); |
} elsif ($sheettype eq 'assesscalc' && |
} elsif ($sheettype eq 'assesscalc' && |
defined($symb) && |
defined($symb) && |
$allowed_to_edit) { |
$allowed_to_edit) { |
$spreadsheet = Apache::assesscalc->new($name,$domain,$filename,$symb); |
$spreadsheet = Apache::assesscalc->new($name,$domain,$filename,$symb, |
|
$section,\@groups); |
} else { |
} else { |
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
Line 458 ENDSCRIPT
|
Line 482 ENDSCRIPT
|
## Editing/loading/saving |
## Editing/loading/saving |
if ($allowed_to_edit) { |
if ($allowed_to_edit) { |
my ($html,$action_message) = &file_dialogs($spreadsheet); |
my ($html,$action_message) = &file_dialogs($spreadsheet); |
if ($ENV{'form.makedefault'}) { |
if ($env{'form.makedefault'}) { |
$spreadsheet->make_default(); |
$spreadsheet->make_default(); |
if ($action_message) { |
if ($action_message) { |
$action_message .= '<br />'; |
$action_message .= '<br />'; |
Line 518 END
|
Line 542 END
|
# Keep track of the number of times we have been called, sort of. |
# Keep track of the number of times we have been called, sort of. |
$r->print(&hiddenfield('not_first_run','whatever')); |
$r->print(&hiddenfield('not_first_run','whatever')); |
# |
# |
if (exists($ENV{'form.not_first_run'}) || $sheettype ne 'classcalc') { |
if (exists($env{'form.not_first_run'}) || $sheettype ne 'classcalc') { |
$r->print($spreadsheet->get_html_title()); |
$r->print($spreadsheet->get_html_title()); |
if ($allowed_to_view || $allowed_to_edit) { |
if ($allowed_to_view || $allowed_to_edit) { |
$r->print($spreadsheet->parent_link()); |
$r->print($spreadsheet->parent_link()); |
Line 526 END
|
Line 550 END
|
$r->rflush(); |
$r->rflush(); |
$spreadsheet->display($r); |
$spreadsheet->display($r); |
} |
} |
$r->print('</form></body></html>'); |
$r->print('</form>'.&Apache::loncommon::end_page()); |
|
$spreadsheet->clear_package(); |
return OK; |
return OK; |
} |
} |
|
|