--- loncom/interface/spreadsheet/lonspreadsheet.pm 2003/05/19 15:53:07 1.3
+++ loncom/interface/spreadsheet/lonspreadsheet.pm 2020/09/08 04:39:15 1.61.6.2.2.1
@@ -1,5 +1,5 @@
#
-# $Id: lonspreadsheet.pm,v 1.3 2003/05/19 15:53:07 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.61.6.2.2.1 2020/09/08 04:39:15 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -54,12 +54,17 @@ 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 Apache::lonquickgrades();
use HTML::Entities();
##
@@ -68,43 +73,141 @@ use HTML::Entities();
sub textfield {
my ($title,$name,$value)=@_;
- return "\n
$title: ".
- ' ';
+ return "\n
$title: ".
+ ' ';
}
sub hiddenfield {
my ($name,$value)=@_;
- return ' '."\n";
+ return ' '."\n";
}
sub selectbox {
my ($title,$name,$value,%options)=@_;
- my $selout="\n
$title: ".'';
+ my $selout="\n$title: ".'';
foreach (sort keys(%options)) {
$selout.=''.$options{$_}.' ';
+ if ($_ eq $value) { $selout.=' selected="selected"'; }
+ $selout.='>'.&mt($options{$_}).'';
}
return $selout.' ';
}
+sub file_dialogs {
+ my ($spreadsheet) = @_;
+ my $bgcolor = "#FFFFFF";
+ my $sheettype = $spreadsheet->{'type'};
+ my $result = '';
+ my $message = '';
+ ##
+ ## Deal with saving the spreadsheet
+ $spreadsheet->check_formulas_loaded();
+ 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 .= ''.
+ &mt('An error occurred while saving the spreadsheet. The error is: [_1].',
+ $save_status).' ';
+ } else {
+ $message .= ''.&mt('Spreadsheet saved as: [_1] .',
+ ''.$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
+
+
+
+END
+ my $default_filename_set = 0;
+ foreach my $sheetfilename ($spreadsheet->othersheets()) {
+ $load_dialog .= ' \n";
+ }
+ $load_dialog .= " \n \n\n";
+ #
+ my $headline = &mt('File Dialogs');
+ $result .=<
+ $headline
+ -->
+
+
+
+ $load_dialog
+
+
+ $save_dialog
+ $makedefault_dialog
+
+
+
+
+
+END
+ return ($result,$message);
+}
+
sub handler {
my $r=shift;
#
- # Overload checking
- #
- # Check this server
- my $loaderror=&Apache::lonnet::overloaderror($r);
- if ($loaderror) { return $loaderror; }
- # Check the course homeserver
- $loaderror= &Apache::lonnet::overloaderror($r,
- $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
- 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;
}
@@ -112,72 +215,182 @@ sub handler {
# Roles Checking
#
# 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
- $ENV{'user.error.msg'}=
+ $env{'user.error.msg'}=
$r->uri.":opa:0:0:Cannot modify spreadsheet";
return HTTP_NOT_ACCEPTABLE;
}
+ my ($sheettype) = ($r->uri=~/\/(\w+)$/);
+ my $courseid = $env{'request.course.id'};
+
+ ##
+ ## 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.
+ }
+
+ #
+ # Check if display of course gradebook is blocked
+ #
+
+ if ($env{'request.course.id'}) {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my ($blocked,$blocktext) =
+ &Apache::loncommon::blocking_status('grades',$cnum,$cdom);
+ if ($blocked) {
+ my $checkrole = "cm./$cdom/$cnum";
+ if ($env{'request.course.sec'} ne '') {
+ $checkrole .= "/$env{'request.course.sec'}";
+ }
+ unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) &&
+ ($env{'request.role'} !~ m{^st\./$cdom/$cnum})) {
+ &Apache::lonquickgrades::grades_blocked($r,$blocktext,'spreadsheet');
+ return OK;
+ }
+ }
+ }
+
+ #
+ # Do not allow users without vgr or mgr priv to continue unless
+ # grading type is set to spreadsheet.
+ #
+
+ if ((!$allowed_to_view) && (!$allowed_to_edit)) {
+ if ($env{'course.'.$courseid.'.grading'} eq 'spreadsheet') {
+ if ($sheettype ne 'studentcalc') {
+ $r->internal_redirect('/adm/studentcalc');
+ return OK;
+ }
+ } else {
+ $r->internal_redirect('/adm/quickgrades');
+ return OK;
+ }
+ }
#
# 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',
+ 'output_format','not_first_run']);
#
# Deal with restricted student permissions
#
- if ($ENV{'request.role'} =~ /^st\./) {
- delete $ENV{'form.cell'} if (exists($ENV{'form.cell'}));
- delete $ENV{'form.newformula'} if (exists($ENV{'form.newformula'}));
+ if ($env{'request.role'} =~ /^st\./) {
+ delete $env{'form.cell'} if (exists($env{'form.cell'}));
+ delete $env{'form.newformula'} if (exists($env{'form.newformula'}));
}
#
# Determine basic information about the spreadsheet
- my ($sheettype) = ($r->uri=~/\/(\w+)$/);
#
my $symb = undef;
- $symb = $ENV{'form.usymb'} if (exists($ENV{'form.usymb'}));
- my $name = $ENV{'user.name'};
- my $domain = $ENV{'user.domain'};
- if (exists($ENV{'form.sname'})) {
- $name = $ENV{'form.sname'};
- $domain = $ENV{'form.sdomain'};
+ $symb = $env{'form.usymb'} if (exists($env{'form.usymb'}));
+ my $name = $env{'user.name'};
+ my $domain = $env{'user.domain'};
+ my $warning;
+ if (exists($env{'form.sname'}) && $env{'form.sname'} ne '') {
+ if (($env{'form.sname'} ne $env{'user.name'}) ||
+ ($env{'form.sdomain'} ne $env{'user.domain'})) {
+ if (($allowed_to_view) || ($allowed_to_edit)) {
+ if (&Apache::lonnet::homeserver($env{'form.sname'},$env{'form.sdomain'}) ne 'no_host') {
+ $name = $env{'form.sname'};
+ $domain = $env{'form.sdomain'};
+ } else {
+ $warning = &mt('Requested user: "[_1]" does not exist; your own sheet is displayed instead.',$env{'form.sname'}.':'.$env{'form.sdomain'});
+ }
+ } else {
+ $warning = &mt('Your current role is not permitted to display this sheet for the requested user: "[_1]"; your own sheet is displayed instead.',$env{'form.sname'}.':'.$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;
- ##
- ## Check permissions
- my $allowed_to_edit = &Apache::lonnet::allowed('mgr',
- $ENV{'request.course.id'});
- my $allowed_to_view = &Apache::lonnet::allowed('vgr',
- $ENV{'request.course.id'});
+ $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'});
+ }
+
#
# 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 (! $allowed_to_view) {
- $r->print('Access Permission Denied '.
- '