--- loncom/interface/spreadsheet/lonspreadsheet.pm 2006/10/31 18:35:51 1.49 +++ loncom/interface/spreadsheet/lonspreadsheet.pm 2020/08/10 19:28:21 1.66 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.49 2006/10/31 18:35:51 albertel Exp $ +# $Id: lonspreadsheet.pm,v 1.66 2020/08/10 19:28:21 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -64,6 +64,7 @@ use Apache::lonnet; use Apache::lonhtmlcommon; use Apache::lonlocal; use Apache::loncoursedata(); +use Apache::lonquickgrades(); use HTML::Entities(); ## @@ -73,12 +74,12 @@ use HTML::Entities(); sub textfield { my ($title,$name,$value)=@_; return "\n

$title:
". - ''; + ''; } sub hiddenfield { my ($name,$value)=@_; - return ''."\n"; + return ''."\n"; } sub selectbox { @@ -86,7 +87,7 @@ sub selectbox { my $selout="\n

$title:
".''; @@ -106,10 +107,13 @@ sub file_dialogs { $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; + $message .= ''. + &mt('An error occurred while saving the spreadsheet. The error is: [_1].', + $save_status).''; } else { - $message .= "Spreadsheet saved as ".$spreadsheet->filename(); + $message .= ''.&mt('Spreadsheet saved as: [_1] .', + ''.$spreadsheet->filename().''). + ''; } } elsif (exists($env{'form.newformula'}) && exists($env{'form.cell'}) && @@ -140,13 +144,13 @@ sub file_dialogs { if ($spreadsheet->is_default()) { $filename = 'Default'; } - my $save_dialog = ''. + my $save_dialog = ''. ' '. ''. - ''; + ''; my $makedefault_dialog = ''; + 'value="'.&mt('Save as & Make This Sheet the Default').'"/>'; # my $link = '".&mt('Select Spreadsheet File').""; @@ -154,9 +158,9 @@ sub file_dialogs { my $load_dialog = < - + - $link + $link   \n \n\n"; # + my $headline = &mt('File Dialogs'); $result .=< - File Dialogs + $headline --> @@ -199,16 +204,6 @@ END 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) { @@ -226,15 +221,61 @@ sub handler { $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. + } + # - # Do not allow students to continue if standard or external grading is in - # effect. + # Check if display of course gradebook is blocked # - if ($env{'request.role'} =~ /^st\./) { - if ($env{'course.'.$courseid.'.grading'} eq 'standard' || - $env{'course.'.$courseid.'.grading'} eq 'external' ) { - return HTTP_NOT_ACCEPTABLE; + + 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; } } # @@ -252,15 +293,26 @@ sub handler { } # # 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'}; + my $warning; if (exists($env{'form.sname'}) && $env{'form.sname'} ne '') { - $name = $env{'form.sname'}; - $domain = $env{'form.sdomain'}; + 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'}); + } + } } $env{'form.sname'} = $name; $env{'form.sdomain'} = $domain; @@ -275,29 +327,13 @@ sub handler { $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. - } # # 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 (!$allowed_to_view) { + $r->internal_redirect('/adm/studentcalc'); + return OK; } } if ((($name ne $env{'user.name'} ) || @@ -331,18 +367,23 @@ sub handler { ## my $js; if ($allowed_to_edit) { - my %lt=( + my %lt=&Apache::lonlocal::texthash( 'ce' => 'Cell', - 'ac' => 'Accept', - 'dc' => 'Discard Changes' + 'ac' => 'Save', + 'dc' => 'Cancel' ); my $extra_javascript = &Apache::loncommon::browser_and_searcher_javascript(); + my $cell_extra_js = &Apache::loncommon::resize_textarea_js(); my $cell_edit_start = - &Apache::loncommon::start_page('Cell Edit Window',undef, + &Apache::loncommon::start_page('Cell Edit Window',$cell_extra_js, {'only_body' => 1, - 'js_ready' => 1,}); + 'js_ready' => 1, + 'add_entries' => { + 'onresize' => "resize_textarea('LC_newformula','LC_aftertextarea')", + 'onload' => "resize_textarea('LC_newformula','LC_aftertextarea')", + }}); my $cell_edit_end = &Apache::loncommon::end_page({'js_ready' => 1,}); @@ -358,13 +399,14 @@ sub handler { // cellformula may contain less-than and greater-than symbols, so // we need to escape them? edit_text +='$cell_edit_start'; - edit_text += ''; + edit_text += ''; edit_text += '

$lt{'ce'} '+cellname+'

'; - edit_text += ''; + edit_text += '

'; edit_text += ' @@ -397,8 +440,20 @@ ENDSCRIPT bug => 'Spreadsheet'}); $r->print(&Apache::loncommon::start_page('Grades Spreadsheet',$js). &Apache::lonhtmlcommon::breadcrumbs('Spreadsheet', - 'Spreadsheet_About'). - ''); + 'Spreadsheet_About')); + + # + # Tabs + # + &Apache::lonquickgrades::startGradeScreen($r,'spreadsheet'); + + # + # Open the form + # + if ($warning) { + $r->print('

'.$warning.'

'); + } + $r->print(''); $r->print(&hiddenfield('sname' ,$env{'form.sname'}). &hiddenfield('sdomain',$env{'form.sdomain'}). &hiddenfield('usymb' ,$env{'form.usymb'})); @@ -420,7 +475,7 @@ ENDSCRIPT if (exists($env{'form.recalc'})) { &Apache::loncoursedata::delete_caches($env{'requres.course.id'}); } - if ($env{'form.recalc'} eq 'ilovewastingtime') { + if ($env{'form.recalc'} eq 'expireallsheets') { &Apache::lonnet::logthis('spreadsheet expired: entire course'); # expire ALL spreadsheets &Apache::lonnet::expirespread('','','studentcalc'); @@ -502,14 +557,11 @@ ENDSCRIPT ''. '
'.$html."
\n"); if ($action_message ne '') { - $r->print(< -Last Action: -   - $action_message - - -END + $r->print( + &Apache::loncommon::confirmwrapper( + &mt('Last Action:') + .$action_message) + ); } $r->rflush(); } else { @@ -525,13 +577,13 @@ END if ($allowed_to_view) { $r->print(''. &Apache::loncommon::help_open_topic("Spreadsheet_About", - 'Spreadsheet Help'). + &mt('Spreadsheet Help')). ''); } if ($allowed_to_edit) { $r->print(''. &Apache::loncommon::help_open_topic("Spreadsheet_Editing", - 'Editing Help'). + &mt('Editing Help')). ''); } $r->print(''); @@ -540,7 +592,7 @@ END $r->print(&hiddenfield('filename',$filename)); # # 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','1')); # if (exists($env{'form.not_first_run'}) || $sheettype ne 'classcalc') { $r->print($spreadsheet->get_html_title()); @@ -550,7 +602,9 @@ END $r->rflush(); $spreadsheet->display($r); } - $r->print(''.&Apache::loncommon::end_page()); + $r->print(''); + &Apache::lonquickgrades::endGradeScreen($r); + $r->print(&Apache::loncommon::end_page()); $spreadsheet->clear_package(); return OK; }