version 1.1061, 2012/03/24 23:35:25
|
version 1.1066, 2012/04/06 01:23:11
|
Line 4076 sub findallcourses {
|
Line 4076 sub findallcourses {
|
############################################### |
############################################### |
|
|
sub blockcheck { |
sub blockcheck { |
my ($setters,$activity,$uname,$udom) = @_; |
my ($setters,$activity,$uname,$udom,$url) = @_; |
|
|
if (!defined($udom)) { |
if (!defined($udom)) { |
$udom = $env{'user.domain'}; |
$udom = $env{'user.domain'}; |
Line 4088 sub blockcheck {
|
Line 4088 sub blockcheck {
|
# If uname and udom are for a course, check for blocks in the course. |
# If uname and udom are for a course, check for blocks in the course. |
|
|
if (&Apache::lonnet::is_course($udom,$uname)) { |
if (&Apache::lonnet::is_course($udom,$uname)) { |
my %records = &Apache::lonnet::dump('comm_block',$udom,$uname); |
my ($startblock,$endblock,$triggerblock) = |
my ($startblock,$endblock)=&get_blocks($setters,$activity,$udom,$uname); |
&get_blocks($setters,$activity,$udom,$uname,$url); |
return ($startblock,$endblock); |
return ($startblock,$endblock,$triggerblock); |
} |
} |
|
|
my $startblock = 0; |
my $startblock = 0; |
my $endblock = 0; |
my $endblock = 0; |
|
my $triggerblock = ''; |
my %live_courses = &findallcourses(undef,$uname,$udom); |
my %live_courses = &findallcourses(undef,$uname,$udom); |
|
|
# If uname is for a user, and activity is course-specific, i.e., |
# If uname is for a user, and activity is course-specific, i.e., |
Line 4209 sub blockcheck {
|
Line 4210 sub blockcheck {
|
# Retrieve blocking times and identity of locker for course |
# Retrieve blocking times and identity of locker for course |
# of specified user, unless user has 'evb' privilege. |
# of specified user, unless user has 'evb' privilege. |
|
|
my ($start,$end)=&get_blocks($setters,$activity,$cdom,$cnum); |
my ($start,$end,$trigger) = |
|
&get_blocks($setters,$activity,$cdom,$cnum,$url); |
if (($start != 0) && |
if (($start != 0) && |
(($startblock == 0) || ($startblock > $start))) { |
(($startblock == 0) || ($startblock > $start))) { |
$startblock = $start; |
$startblock = $start; |
|
if ($trigger ne '') { |
|
$triggerblock = $trigger; |
|
} |
} |
} |
if (($end != 0) && |
if (($end != 0) && |
(($endblock == 0) || ($endblock < $end))) { |
(($endblock == 0) || ($endblock < $end))) { |
$endblock = $end; |
$endblock = $end; |
|
if ($trigger ne '') { |
|
$triggerblock = $trigger; |
|
} |
} |
} |
} |
} |
return ($startblock,$endblock); |
return ($startblock,$endblock,$triggerblock); |
} |
} |
|
|
sub get_blocks { |
sub get_blocks { |
my ($setters,$activity,$cdom,$cnum) = @_; |
my ($setters,$activity,$cdom,$cnum,$url) = @_; |
my $startblock = 0; |
my $startblock = 0; |
my $endblock = 0; |
my $endblock = 0; |
|
my $triggerblock = ''; |
my $course = $cdom.'_'.$cnum; |
my $course = $cdom.'_'.$cnum; |
$setters->{$course} = {}; |
$setters->{$course} = {}; |
$setters->{$course}{'staff'} = []; |
$setters->{$course}{'staff'} = []; |
$setters->{$course}{'times'} = []; |
$setters->{$course}{'times'} = []; |
my %records = &Apache::lonnet::dump('comm_block',$cdom,$cnum); |
$setters->{$course}{'triggers'} = []; |
foreach my $record (keys(%records)) { |
my (@blockers,%triggered); |
my ($start,$end) = ($record =~ m/^(\d+)____(\d+)$/); |
my $now = time; |
if ($start <= time && $end >= time) { |
my %commblocks = &Apache::lonnet::get_comm_blocks($cdom,$cnum); |
my ($staff_name,$staff_dom,$title,$blocks) = |
if ($activity eq 'docs') { |
&parse_block_record($records{$record}); |
@blockers = &Apache::lonnet::has_comm_blocking('bre',undef,$url,\%commblocks); |
if ($blocks->{$activity} eq 'on') { |
foreach my $block (@blockers) { |
push(@{$$setters{$course}{'staff'}},[$staff_name,$staff_dom]); |
if ($block =~ /^firstaccess____(.+)$/) { |
push(@{$$setters{$course}{'times'}}, [$start,$end]); |
my $item = $1; |
if ( ($startblock == 0) || ($startblock > $start) ) { |
my $type = 'map'; |
$startblock = $start; |
my $timersymb = $item; |
|
if ($item eq 'course') { |
|
$type = 'course'; |
|
} elsif ($item =~ /___\d+___/) { |
|
$type = 'resource'; |
|
} else { |
|
$timersymb = &Apache::lonnet::symbread($item); |
|
} |
|
my $start = $env{'course.'.$cdom.'_'.$cnum.'.firstaccess.'.$timersymb}; |
|
my $end = $start + $env{'course.'.$cdom.'_'.$cnum.'.timerinterval.'.$timersymb}; |
|
$triggered{$block} = { |
|
start => $start, |
|
end => $end, |
|
type => $type, |
|
}; |
|
} |
|
} |
|
} else { |
|
foreach my $block (keys(%commblocks)) { |
|
if ($block =~ m/^(\d+)____(\d+)$/) { |
|
my ($start,$end) = ($1,$2); |
|
if ($start <= time && $end >= time) { |
|
if (ref($commblocks{$block}) eq 'HASH') { |
|
if (ref($commblocks{$block}{'blocks'}) eq 'HASH') { |
|
if ($commblocks{$block}{'blocks'}{$activity} eq 'on') { |
|
unless(grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} elsif ($block =~ /^firstaccess____(.+)$/) { |
|
my $item = $1; |
|
my $timersymb = $item; |
|
my $type = 'map'; |
|
if ($item eq 'course') { |
|
$type = 'course'; |
|
} elsif ($item =~ /___\d+___/) { |
|
$type = 'resource'; |
|
} else { |
|
$timersymb = &Apache::lonnet::symbread($item); |
|
} |
|
my $start = $env{'course.'.$cdom.'_'.$cnum.'.firstaccess.'.$timersymb}; |
|
my $end = $start + $env{'course.'.$cdom.'_'.$cnum.'.timerinterval.'.$timersymb}; |
|
if ($start && $end) { |
|
if (($start <= time) && ($end >= time)) { |
|
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
$triggered{$block} = { |
|
start => $start, |
|
end => $end, |
|
type => $type, |
|
}; |
|
} |
|
} |
} |
} |
if ( ($endblock == 0) || ($endblock < $end) ) { |
} |
$endblock = $end; |
} |
|
} |
|
foreach my $blocker (@blockers) { |
|
my ($staff_name,$staff_dom,$title,$blocks) = |
|
&parse_block_record($commblocks{$blocker}); |
|
push(@{$$setters{$course}{'staff'}},[$staff_name,$staff_dom]); |
|
my ($start,$end,$triggertype); |
|
if ($blocker =~ m/^(\d+)____(\d+)$/) { |
|
($start,$end) = ($1,$2); |
|
} elsif (ref($triggered{$blocker}) eq 'HASH') { |
|
$start = $triggered{$blocker}{'start'}; |
|
$end = $triggered{$blocker}{'end'}; |
|
$triggertype = $triggered{$blocker}{'type'}; |
|
} |
|
if ($start) { |
|
push(@{$$setters{$course}{'times'}}, [$start,$end]); |
|
if ($triggertype) { |
|
push(@{$$setters{$course}{'triggers'}},$triggertype); |
|
} else { |
|
push(@{$$setters{$course}{'triggers'}},0); |
|
} |
|
if ( ($startblock == 0) || ($startblock > $start) ) { |
|
$startblock = $start; |
|
if ($triggertype) { |
|
$triggerblock = $blocker; |
} |
} |
} |
} |
|
if ( ($endblock == 0) || ($endblock < $end) ) { |
|
$endblock = $end; |
|
if ($triggertype) { |
|
$triggerblock = $blocker; |
|
} |
|
} |
} |
} |
} |
} |
return ($startblock,$endblock); |
return ($startblock,$endblock,$triggerblock); |
} |
} |
|
|
sub parse_block_record { |
sub parse_block_record { |
Line 4272 sub parse_block_record {
|
Line 4366 sub parse_block_record {
|
} |
} |
|
|
sub blocking_status { |
sub blocking_status { |
my ($activity,$uname,$udom) = @_; |
my ($activity,$uname,$udom,$url) = @_; |
my %setters; |
my %setters; |
|
|
# check for active blocking |
# check for active blocking |
my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom); |
my ($startblock,$endblock,$triggerblock) = |
|
&blockcheck(\%setters,$activity,$uname,$udom,$url); |
my $blocked = $startblock && $endblock ? 1 : 0; |
my $blocked = 0; |
|
if ($startblock && $endblock) { |
|
$blocked = 1; |
|
} |
|
|
# caller just wants to know whether a block is active |
# caller just wants to know whether a block is active |
if (!wantarray) { return $blocked; } |
if (!wantarray) { return $blocked; } |
Line 4286 sub blocking_status {
|
Line 4383 sub blocking_status {
|
# build a link to a popup window containing the details |
# build a link to a popup window containing the details |
my $querystring = "?activity=$activity"; |
my $querystring = "?activity=$activity"; |
# $uname and $udom decide whose portfolio the user is trying to look at |
# $uname and $udom decide whose portfolio the user is trying to look at |
$querystring .= "&udom=$udom" if $udom; |
if ($activity eq 'port') { |
$querystring .= "&uname=$uname" if $uname; |
$querystring .= "&udom=$udom" if $udom; |
|
$querystring .= "&uname=$uname" if $uname; |
|
} elsif ($activity eq 'docs') { |
|
$querystring .= '&url='.&HTML::Entities::encode($url,'&"'); |
|
} |
|
|
my $output .= <<'END_MYBLOCK'; |
my $output .= <<'END_MYBLOCK'; |
function openWindow(url, wdwName, w, h, toolbar,scrollbar) { |
function openWindow(url, wdwName, w, h, toolbar,scrollbar) { |
Line 4302 END_MYBLOCK
|
Line 4403 END_MYBLOCK
|
$output = Apache::lonhtmlcommon::scripttag($output); |
$output = Apache::lonhtmlcommon::scripttag($output); |
|
|
my $popupUrl = "/adm/blockingstatus/$querystring"; |
my $popupUrl = "/adm/blockingstatus/$querystring"; |
my $text = mt('Communication Blocked'); |
my $text = &mt('Communication Blocked'); |
|
if ($activity eq 'docs') { |
|
$text = &mt('Content Access Blocked'); |
|
} elsif ($activity eq 'printout') { |
|
$text = &mt('Printing Blocked'); |
|
} |
$output .= <<"END_BLOCK"; |
$output .= <<"END_BLOCK"; |
<div class='LC_comblock'> |
<div class='LC_comblock'> |
<a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' |
<a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' |
Line 6811 sub headtag {
|
Line 6916 sub headtag {
|
'<head>'. |
'<head>'. |
&font_settings(); |
&font_settings(); |
|
|
|
my $inhibitprint = &print_suppression(); |
|
|
if (!$args->{'frameset'}) { |
if (!$args->{'frameset'}) { |
$result .= &Apache::lonhtmlcommon::htmlareaheaders(); |
$result .= &Apache::lonhtmlcommon::htmlareaheaders(); |
} |
} |
Line 6856 ADDMETA
|
Line 6963 ADDMETA
|
if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } |
if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } |
$result .= '<title> LON-CAPA '.$title.'</title>' |
$result .= '<title> LON-CAPA '.$title.'</title>' |
.'<link rel="stylesheet" type="text/css" href="'.$url.'" />' |
.'<link rel="stylesheet" type="text/css" href="'.$url.'" />' |
|
.$inhibitprint |
.$head_extra; |
.$head_extra; |
return $result.'</head>'; |
return $result.'</head>'; |
} |
} |
Line 6881 sub font_settings {
|
Line 6989 sub font_settings {
|
|
|
=pod |
=pod |
|
|
|
=item * &print_suppression() |
|
|
|
In course context returns css which causes the body to be blank when media="print", |
|
if printout generation is unavailable for the current resource. |
|
|
|
This could be because: |
|
|
|
(a) printstartdate is in the future |
|
|
|
(b) printenddate is in the past |
|
|
|
(c) there is an active exam block with "printout" |
|
functionality blocked |
|
|
|
Users with pav, pfo or evb privileges are exempt. |
|
|
|
Inputs: none |
|
|
|
=cut |
|
|
|
|
|
sub print_suppression { |
|
my $noprint; |
|
if ($env{'request.course.id'}) { |
|
my $scope = $env{'request.course.id'}; |
|
if ((&Apache::lonnet::allowed('pav',$scope)) || |
|
(&Apache::lonnet::allowed('pfo',$scope))) { |
|
return; |
|
} |
|
if ($env{'request.course.sec'} ne '') { |
|
$scope .= "/$env{'request.course.sec'}"; |
|
if ((&Apache::lonnet::allowed('pav',$scope)) || |
|
(&Apache::lonnet::allowed('pfo',$scope))) { |
|
return; |
|
} |
|
} |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $blocked = &blocking_status('printout',$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})) { |
|
$noprint = 1; |
|
} |
|
} |
|
unless ($noprint) { |
|
my $symb = &Apache::lonnet::symbread(); |
|
if ($symb ne '') { |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my $res = $navmap->getBySymb($symb); |
|
if (ref($res)) { |
|
if (!$res->resprintable()) { |
|
$noprint = 1; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($noprint) { |
|
return <<"ENDSTYLE"; |
|
<style type="text/css" media="print"> |
|
body { display:none } |
|
</style> |
|
ENDSTYLE |
|
} |
|
} |
|
return; |
|
} |
|
|
|
=pod |
|
|
=item * &xml_begin() |
=item * &xml_begin() |
|
|
Returns the needed doctype and <html> |
Returns the needed doctype and <html> |
Line 9744 sub is_archive_file {
|
Line 9928 sub is_archive_file {
|
} |
} |
|
|
sub decompress_form { |
sub decompress_form { |
my ($mimetype,$archiveurl,$action,$noextract,$hiddenelements) = @_; |
my ($mimetype,$archiveurl,$action,$noextract,$hiddenelements,$dirlist) = @_; |
my %lt = &Apache::lonlocal::texthash ( |
my %lt = &Apache::lonlocal::texthash ( |
this => 'This file is an archive file.', |
this => 'This file is an archive file.', |
|
itsc => 'Its contents are as follows:', |
youm => 'You may wish to extract its contents.', |
youm => 'You may wish to extract its contents.', |
camt => 'Extraction of contents is recommended for Camtasia zip files.', |
camt => 'Extraction of contents is recommended for Camtasia zip files.', |
perm => 'Permanently remove archive file after extraction of contents?', |
|
extr => 'Extract contents', |
extr => 'Extract contents', |
yes => 'Yes', |
yes => 'Yes', |
no => 'No', |
no => 'No', |
); |
); |
my $output = '<p>'.$lt{'this'}.' '.$lt{'youm'}.'<br />'; |
my $output = '<p>'.$lt{'this'}; |
|
my $fileloc = &Apache::lonnet::filelocation(undef,$archiveurl); |
|
my (%toplevel,@paths); |
|
my $info = &list_archive_contents($fileloc,\@paths); |
|
if (@paths) { |
|
foreach my $path (@paths) { |
|
$path =~ s{^/}{}; |
|
if ($path =~ m{^([^/]+)/}) { |
|
$toplevel{$1} = $path; |
|
} else { |
|
$toplevel{$path} = $path; |
|
} |
|
} |
|
} |
|
if ($info eq '') { |
|
$output .= ' '.$lt{'youm'}.'</p>'."\n"; |
|
} else { |
|
$output .= ' '.$lt{'itsc'}.'</p>'."\n". |
|
'<div><pre>'.$info.'</pre></div>'; |
|
} |
|
my $duplicates; |
|
my $num = 0; |
|
if (ref($dirlist) eq 'ARRAY') { |
|
foreach my $item (@{$dirlist}) { |
|
if (ref($item) eq 'ARRAY') { |
|
if (exists($toplevel{$item->[0]})) { |
|
$duplicates .= |
|
&start_data_table_row(). |
|
'<td><label><input type="radio" name="archive_overwrite_'.$num.'" '. |
|
'value="0" checked="checked" />'.&mt('No').'</label>'. |
|
' <label><input type="radio" name="archive_overwrite_'.$num.'" '. |
|
'value="1" />'.&mt('Yes').'</label>'. |
|
'<input type="hidden" name="archive_overwrite_name_'.$num.'" value="'.$item->[0].'" /></td>'."\n". |
|
'<td>'.$item->[0].'</td>'; |
|
if ($item->[2]) { |
|
$duplicates .= '<td>'.&mt('Directory').'</td>'; |
|
} else { |
|
$duplicates .= '<td>'.&mt('File').'</td>'; |
|
} |
|
$duplicates .= '<td>'.$item->[3].'</td>'. |
|
'<td>'. |
|
&Apache::lonlocal::locallocaltime($item->[4]). |
|
'</td>'. |
|
&end_data_table_row(); |
|
$num ++; |
|
} |
|
} |
|
} |
|
} |
|
my $itemcount; |
|
if (@paths > 0) { |
|
$itemcount = scalar(@paths); |
|
} else { |
|
$itemcount = 1; |
|
} |
|
$output .= |
|
'<input type="hidden" name="archive_overwrite_total" value="'.$num.'" />'. |
|
'<input type="hidden" name="archive_itemcount" value="'.$itemcount.'" />'."\n"; |
|
if ($duplicates ne '') { |
|
$output .= '<p><span class="LC_warning">'. |
|
&mt('Warning: decompression of the archive will overwrite the following items which already exist:').'</span><br />'. |
|
&start_data_table(). |
|
&start_data_table_header_row(). |
|
'<th>'.&mt('Overwrite?').'</th>'. |
|
'<th>'.&mt('Name').'</th>'. |
|
'<th>'.&mt('Type').'</th>'. |
|
'<th>'.&mt('Size').'</th>'. |
|
'<th>'.&mt('Last modified').'</th>'. |
|
&end_data_table_header_row(). |
|
$duplicates. |
|
&end_data_table(). |
|
'</p>'; |
|
} |
if ($mimetype =~ m{^application/(x\-)?(compressed|zip)}) { |
if ($mimetype =~ m{^application/(x\-)?(compressed|zip)}) { |
$output .= $lt{'camt'}; |
$output .= '<p>'.$lt{'camt'}.'</p>'; |
} |
} |
$output .= '</p>'; |
|
$output .= <<"START"; |
$output .= <<"START"; |
<div id="uploadfileresult"> |
<div id="uploadfileresult"> |
<form name="uploaded_decompress" action="$action" method="post"> |
<form name="uploaded_decompress" action="$action" method="post"> |
Line 9770 START
|
Line 10025 START
|
} |
} |
} |
} |
$output .= <<"END"; |
$output .= <<"END"; |
<span class="LC_nobreak">$lt{'perm'} |
|
<label><input type="radio" name="archivedelete" value="0" checked="checked" />$lt{'no'}</label> |
|
<label><input type="radio" name="archivedelete" value="1" />$lt{'yes'}</label></span><br /> |
|
<input type="submit" name="decompress" value="$lt{'extr'}" /> |
<input type="submit" name="decompress" value="$lt{'extr'}" /> |
</form> |
</form> |
$noextract |
$noextract |
Line 9781 END
|
Line 10033 END
|
return $output; |
return $output; |
} |
} |
|
|
|
sub decompression_utility { |
|
my ($program) = @_; |
|
my @utilities = ('tar','gunzip','bunzip2','unzip'); |
|
my $location; |
|
if (grep(/^\Q$program\E$/,@utilities)) { |
|
foreach my $dir ('/bin/','/usr/bin/','/usr/local/bin/','/sbin/', |
|
'/usr/sbin/') { |
|
if (-x $dir.$program) { |
|
$location = $dir.$program; |
|
last; |
|
} |
|
} |
|
} |
|
return $location; |
|
} |
|
|
|
sub list_archive_contents { |
|
my ($file,$pathsref) = @_; |
|
my (@cmd,$output); |
|
my $needsregexp; |
|
if ($file =~ /\.zip$/) { |
|
@cmd = (&decompression_utility('unzip'),"-l"); |
|
$needsregexp = 1; |
|
} elsif (($file =~ m/\.tar\.gz$/) || |
|
($file =~ /\.tgz$/)) { |
|
@cmd = (&decompression_utility('tar'),"-ztf"); |
|
} elsif ($file =~ /\.tar\.bz2$/) { |
|
@cmd = (&decompression_utility('tar'),"-jtf"); |
|
} elsif ($file =~ m|\.tar$|) { |
|
@cmd = (&decompression_utility('tar'),"-tf"); |
|
} |
|
if (@cmd) { |
|
undef($!); |
|
undef($@); |
|
if (open(my $fh,"-|", @cmd, $file)) { |
|
while (my $line = <$fh>) { |
|
$output .= $line; |
|
chomp($line); |
|
my $item; |
|
if ($needsregexp) { |
|
($item) = ($line =~ /^\s*\d+\s+[\d\-]+\s+[\d:]+\s*(.+)$/); |
|
} else { |
|
$item = $line; |
|
} |
|
if ($item ne '') { |
|
unless (grep(/^\Q$item\E$/,@{$pathsref})) { |
|
push(@{$pathsref},$item); |
|
} |
|
} |
|
} |
|
close($fh); |
|
} |
|
} |
|
return $output; |
|
} |
|
|
sub decompress_uploaded_file { |
sub decompress_uploaded_file { |
my ($file,$dir) = @_; |
my ($file,$dir) = @_; |
&Apache::lonnet::appenv({'cgi.file' => $file}); |
&Apache::lonnet::appenv({'cgi.file' => $file}); |
Line 9810 sub process_decompression {
|
Line 10118 sub process_decompression {
|
} else { |
} else { |
my @ids=&Apache::lonnet::current_machine_ids(); |
my @ids=&Apache::lonnet::current_machine_ids(); |
my $currdir = "$dir_root/$destination"; |
my $currdir = "$dir_root/$destination"; |
my ($currdirlistref,$currlisterror) = |
|
&Apache::lonnet::dirlist($currdir,$docudom,$docuname,1); |
|
if (grep(/^\Q$docuhome\E$/,@ids)) { |
if (grep(/^\Q$docuhome\E$/,@ids)) { |
$dir = &LONCAPA::propath($docudom,$docuname). |
$dir = &LONCAPA::propath($docudom,$docuname). |
"$dir_root/$destination"; |
"$dir_root/$destination"; |
Line 9822 sub process_decompression {
|
Line 10128 sub process_decompression {
|
$error = &mt('Archive file not found.'); |
$error = &mt('Archive file not found.'); |
} |
} |
} |
} |
if ($dir eq '') { |
my (@to_overwrite,@to_skip); |
|
if ($env{'form.archive_overwrite_total'} > 0) { |
|
my $total = $env{'form.archive_overwrite_total'}; |
|
for (my $i=0; $i<$total; $i++) { |
|
if ($env{'form.archive_overwrite_'.$i} == 1) { |
|
push(@to_overwrite,$env{'form.archive_overwrite_name_'.$i}); |
|
} elsif ($env{'form.archive_overwrite_'.$i} == 0) { |
|
push(@to_skip,$env{'form.archive_overwrite_name_'.$i}); |
|
} |
|
} |
|
} |
|
my $numskip = scalar(@to_skip); |
|
if (($numskip > 0) && |
|
($numskip == $env{'form.archive_itemcount'})) { |
|
$warning = &mt('All items in the archive file already exist, and no overwriting of existing files has been requested.'); |
|
} elsif ($dir eq '') { |
$error = &mt('Directory containing archive file unavailable.'); |
$error = &mt('Directory containing archive file unavailable.'); |
} elsif (!$error) { |
} elsif (!$error) { |
my ($decompressed,$display) = &decompress_uploaded_file($file,$dir); |
my ($decompressed,$display); |
|
if ($numskip > 0) { |
|
my $tempdir = time.'_'.$$.int(rand(10000)); |
|
mkdir("$dir/$tempdir",0755); |
|
system("mv $dir/$file $dir/$tempdir/$file"); |
|
($decompressed,$display) = |
|
&decompress_uploaded_file($file,"$dir/$tempdir"); |
|
foreach my $item (@to_skip) { |
|
if (($item ne '') && ($item !~ /\.\./)) { |
|
if (-f "$dir/$tempdir/$item") { |
|
unlink("$dir/$tempdir/$item"); |
|
} elsif (-d "$dir/$tempdir/$item") { |
|
system("rm -rf $dir/$tempdir/$item"); |
|
} |
|
} |
|
} |
|
system("mv $dir/$tempdir/* $dir"); |
|
rmdir("$dir/$tempdir"); |
|
} else { |
|
($decompressed,$display) = |
|
&decompress_uploaded_file($file,$dir); |
|
} |
if ($decompressed eq 'ok') { |
if ($decompressed eq 'ok') { |
$output = &mt('Files extracted successfully from archive.').'<br />'; |
$output = '<p class="LC_info">'. |
|
&mt('Files extracted successfully from archive.'). |
|
'</p>'."\n"; |
my ($warning,$result,@contents); |
my ($warning,$result,@contents); |
my ($newdirlistref,$newlisterror) = |
my ($newdirlistref,$newlisterror) = |
&Apache::lonnet::dirlist($currdir,$docudom, |
&Apache::lonnet::dirlist($currdir,$docudom, |
$docuname,1); |
$docuname,1); |
my (%is_dir,%changes,@newitems); |
my (%is_dir,%changes,@newitems); |
my $dirptr = 16384; |
my $dirptr = 16384; |
if (ref($currdirlistref) eq 'ARRAY') { |
if (ref($newdirlistref) eq 'ARRAY') { |
my @curritems; |
|
foreach my $dir_line (@{$currdirlistref}) { |
|
my ($item,$rest)=split(/\&/,$dir_line,2); |
|
unless ($item =~ /\.+$/) { |
|
push(@curritems,$item); |
|
} |
|
} |
|
if (ref($newdirlistref) eq 'ARRAY') { |
|
foreach my $dir_line (@{$newdirlistref}) { |
|
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,4); |
|
unless ($item =~ /^\.+$/) { |
|
if ($dirptr&$testdir) { |
|
$is_dir{$item} = 1; |
|
} |
|
push(@newitems,$item); |
|
} |
|
} |
|
my @diffs = &compare_arrays(\@curritems,\@newitems); |
|
if (@diffs > 0) { |
|
foreach my $item (@diffs) { |
|
$changes{$item} = 1; |
|
} |
|
} |
|
} |
|
} elsif (ref($newdirlistref) eq 'ARRAY') { |
|
foreach my $dir_line (@{$newdirlistref}) { |
foreach my $dir_line (@{$newdirlistref}) { |
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,5); |
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,5); |
unless ($item =~ /\.+$/) { |
unless (($item =~ /^\.+$/) || ($item eq $file) || |
|
((@to_skip > 0) && (grep(/^\Q$item\E$/,@to_skip)))) { |
push(@newitems,$item); |
push(@newitems,$item); |
if ($dirptr&$testdir) { |
if ($dirptr&$testdir) { |
$is_dir{$item} = 1; |
$is_dir{$item} = 1; |
Line 9889 sub process_decompression {
|
Line 10209 sub process_decompression {
|
if ($datatable ne '') { |
if ($datatable ne '') { |
$output .= &archive_options_form('decompressed',$datatable, |
$output .= &archive_options_form('decompressed',$datatable, |
$count,$hiddenelem); |
$count,$hiddenelem); |
my $startcount = 4; |
my $startcount = 6; |
$output .= &archive_javascript($startcount,$count, |
$output .= &archive_javascript($startcount,$count, |
\%titles,\%children); |
\%titles,\%children); |
} |
} |
Line 10018 sub archive_row {
|
Line 10338 sub archive_row {
|
my $offset = 0; |
my $offset = 0; |
foreach my $action ('display','dependency','discard') { |
foreach my $action ('display','dependency','discard') { |
$offset ++; |
$offset ++; |
|
if ($action ne 'display') { |
|
$offset ++; |
|
} |
$output .= '<td><span class="LC_nobreak">'. |
$output .= '<td><span class="LC_nobreak">'. |
'<label><input type="radio" name="archive_'.$count. |
'<label><input type="radio" name="archive_'.$count. |
'" id="archive_'.$action.'_'.$count.'" value="'.$action.'"'; |
'" id="archive_'.$action.'_'.$count.'" value="'.$action.'"'; |
Line 10063 sub archive_row {
|
Line 10386 sub archive_row {
|
} |
} |
|
|
sub archive_options_form { |
sub archive_options_form { |
my ($form,$output,$count,$hiddenelem) = @_; |
my ($form,$display,$count,$hiddenelem) = @_; |
return '<form name="'.$form.'" method="post" action="">'."\n". |
my %lt = &Apache::lonlocal::texthash( |
'<input type="hidden" name="phase" value="decompress_cleanup" />'."\n". |
perm => 'Permanently remove archive file?', |
'<p>'. |
hows => 'How should each extracted item be incorporated in the course?', |
&mt('How should each item be incorporated in the course?'). |
cont => 'Content actions for all', |
'</p>'. |
addf => 'Add as folder/file', |
'<div class="LC_columnSection"><fieldset>'. |
incd => 'Include as dependency for a displayed file', |
'<legend>'.&mt('Content actions for all').'</legend>'. |
disc => 'Discard', |
'<input type="button" value="'.&mt('Add as folder/file').'" '. |
no => 'No', |
'onclick="javascript:checkAll(document.'.$form.",'display'".')" />'. |
yes => 'Yes', |
' <input type="button" value="'.&mt('Include as dependency for a displayed file').'"'. |
save => 'Save', |
' onclick="javascript:checkAll(document.'.$form.",'dependency'".')" />'. |
); |
' <input type="button" value="'.&mt('Discard').'"'. |
my $output = <<"END"; |
' onclick="javascript:checkAll(document.'.$form.",'discard'".')" />'. |
<form name="$form" method="post" action=""> |
'</fieldset></div>'. |
<p><span class="LC_nobreak">$lt{'perm'} |
|
<label> |
|
<input type="radio" name="archivedelete" value="0" checked="checked" />$lt{'no'} |
|
</label> |
|
|
|
<label> |
|
<input type="radio" name="archivedelete" value="1" />$lt{'yes'}</label> |
|
</span> |
|
</p> |
|
<input type="hidden" name="phase" value="decompress_cleanup" /> |
|
<br />$lt{'hows'} |
|
<div class="LC_columnSection"> |
|
<fieldset> |
|
<legend>$lt{'cont'}</legend> |
|
<input type="button" value="$lt{'addf'}" onclick="javascript:checkAll(document.$form,'display');" /> |
|
<input type="button" value="$lt{'incd'}" onclick="javascript:checkAll(document.$form,'dependency');" /> |
|
<input type="button" value="$lt{'disc'}" onclick="javascript:checkAll(document.$form,'discard');" /> |
|
</fieldset> |
|
</div> |
|
END |
|
return $output. |
&start_data_table()."\n". |
&start_data_table()."\n". |
$output."\n". |
$display."\n". |
&end_data_table()."\n". |
&end_data_table()."\n". |
'<input type="hidden" name="archive_count" value="'.$count.'" />'. |
'<input type="hidden" name="archive_count" value="'.$count.'" />'. |
$hiddenelem. |
$hiddenelem. |
'<br /><input type="submit" name="archive_submit" value="'.&mt('Save').'" />'. |
'<br /><input type="submit" name="archive_submit" value="'.$lt{'save'}.'" />'. |
'</form>'; |
'</form>'; |
} |
} |
|
|
Line 10204 function dependencyCheck(form,count,offs
|
Line 10547 function dependencyCheck(form,count,offs
|
|
|
function propagateSelect(form,count,offset) { |
function propagateSelect(form,count,offset) { |
if (count > 0) { |
if (count > 0) { |
var item = (2+offset+$startcount)+7*(count-1); |
var item = (1+offset+$startcount)+7*(count-1); |
var picked = form.elements[item].options[form.elements[item].selectedIndex].value; |
var picked = form.elements[item].options[form.elements[item].selectedIndex].value; |
if (Object.prototype.toString.call(parents[count]) === '[object Array]') { |
if (Object.prototype.toString.call(parents[count]) === '[object Array]') { |
if (parents[count].length > 0) { |
if (parents[count].length > 0) { |
Line 10218 function propagateSelect(form,count,offs
|
Line 10561 function propagateSelect(form,count,offs
|
|
|
function containerSelect(form,count,offset,picked) { |
function containerSelect(form,count,offset,picked) { |
if (count > 0) { |
if (count > 0) { |
var item = (1+offset+$startcount)+7*(count-1); |
var item = (offset+$startcount)+7*(count-1); |
if (form.elements[item].type == 'radio') { |
if (form.elements[item].type == 'radio') { |
if (form.elements[item].value == 'dependency') { |
if (form.elements[item].value == 'dependency') { |
if (form.elements[item+1].type == 'select-one') { |
if (form.elements[item+1].type == 'select-one') { |
Line 10268 END
|
Line 10611 END
|
} |
} |
|
|
sub process_extracted_files { |
sub process_extracted_files { |
my ($context,$docudom,$docuname,$destination,$dir_root,$hiddenelem) = @_; |
my ($context,$docudom,$docuname,$url,$destination,$dir_root,$hiddenelem) = @_; |
my $numitems = $env{'form.archive_count'}; |
my $numitems = $env{'form.archive_count'}; |
return unless ($numitems); |
return unless ($numitems); |
my @ids=&Apache::lonnet::current_machine_ids(); |
my @ids=&Apache::lonnet::current_machine_ids(); |
Line 10315 sub process_extracted_files {
|
Line 10658 sub process_extracted_files {
|
(my $count,undef) = &get_extracted($docudom,$docuname,$currdir,\%is_dir,\%children, |
(my $count,undef) = &get_extracted($docudom,$docuname,$currdir,\%is_dir,\%children, |
\%parent,\@contents,\%dirorder,\%titles); |
\%parent,\@contents,\%dirorder,\%titles); |
} |
} |
my (%referrer,%orphaned,%todelete,%newdest,%newseqid); |
my (%referrer,%orphaned,%todelete,%todeletedir,%newdest,%newseqid); |
if ($numitems) { |
if ($numitems) { |
for (my $i=1; $i<=$numitems; $i++) { |
for (my $i=1; $i<=$numitems; $i++) { |
my $path = $env{'form.archive_content_'.$i}; |
my $path = $env{'form.archive_content_'.$i}; |
Line 10323 sub process_extracted_files {
|
Line 10666 sub process_extracted_files {
|
if ($env{'form.archive_'.$i} eq 'discard') { |
if ($env{'form.archive_'.$i} eq 'discard') { |
if ($prefix ne '' && $path ne '') { |
if ($prefix ne '' && $path ne '') { |
if (-e $prefix.$path) { |
if (-e $prefix.$path) { |
$todelete{$prefix.$path} = 1; |
if ((@archdirs > 0) && |
|
(grep(/^\Q$i\E$/,@archdirs))) { |
|
$todeletedir{$prefix.$path} = 1; |
|
} else { |
|
$todelete{$prefix.$path} = 1; |
|
} |
} |
} |
} |
} |
} elsif ($env{'form.archive_'.$i} eq 'display') { |
} elsif ($env{'form.archive_'.$i} eq 'display') { |
Line 10459 sub process_extracted_files {
|
Line 10807 sub process_extracted_files {
|
if (keys(%todelete)) { |
if (keys(%todelete)) { |
foreach my $key (keys(%todelete)) { |
foreach my $key (keys(%todelete)) { |
unlink($key); |
unlink($key); |
unless ($ishome) { |
} |
#FIXME Need to notify homeserver to delete files. |
} |
} |
if (keys(%todeletedir)) { |
|
foreach my $key (keys(%todeletedir)) { |
|
rmdir($key); |
|
} |
|
} |
|
foreach my $dir (sort(keys(%is_dir))) { |
|
if (($pathtocheck ne '') && ($dir ne '')) { |
|
&cleanup_empty_dirs($prefix."$pathtocheck/$dir"); |
} |
} |
} |
} |
} else { |
} else { |
Line 10477 sub process_extracted_files {
|
Line 10832 sub process_extracted_files {
|
return $output; |
return $output; |
} |
} |
|
|
|
sub cleanup_empty_dirs { |
|
my ($path) = @_; |
|
if (($path ne '') && (-d $path)) { |
|
if (opendir(my $dirh,$path)) { |
|
my @dircontents = grep(!/^\./,readdir($dirh)); |
|
my $numitems = 0; |
|
foreach my $item (@dircontents) { |
|
if (-d "$path/$item") { |
|
&recurse_dirs("$path/$item"); |
|
if (-e "$path/$item") { |
|
$numitems ++; |
|
} |
|
} else { |
|
$numitems ++; |
|
} |
|
} |
|
if ($numitems == 0) { |
|
rmdir($path); |
|
} |
|
closedir($dirh); |
|
} |
|
} |
|
return; |
|
} |
|
|
=pod |
=pod |
|
|
=item * &get_turnedin_filepath() |
=item * &get_turnedin_filepath() |
Line 12622 sub init_user_environment {
|
Line 13002 sub init_user_environment {
|
|
|
# See if old ID present, if so, remove |
# See if old ID present, if so, remove |
|
|
my ($filename,$cookie,$userroles); |
my ($filename,$cookie,$userroles,$firstaccenv,$timerintenv); |
my $now=time; |
my $now=time; |
|
|
if ($public) { |
if ($public) { |
Line 12660 sub init_user_environment {
|
Line 13040 sub init_user_environment {
|
|
|
# Initialize roles |
# Initialize roles |
|
|
$userroles=&Apache::lonnet::rolesinit($domain,$username,$authhost); |
($userroles,$firstaccenv,$timerintenv) = |
|
&Apache::lonnet::rolesinit($domain,$username,$authhost); |
} |
} |
# ------------------------------------ Check browser type and MathML capability |
# ------------------------------------ Check browser type and MathML capability |
|
|
Line 12735 sub init_user_environment {
|
Line 13116 sub init_user_environment {
|
} |
} |
|
|
$env{'user.environment'} = "$lonids/$cookie.id"; |
$env{'user.environment'} = "$lonids/$cookie.id"; |
|
|
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", |
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", |
&GDBM_WRCREAT(),0640)) { |
&GDBM_WRCREAT(),0640)) { |
&_add_to_env(\%disk_env,\%initial_env); |
&_add_to_env(\%disk_env,\%initial_env); |
&_add_to_env(\%disk_env,\%userenv,'environment.'); |
&_add_to_env(\%disk_env,\%userenv,'environment.'); |
&_add_to_env(\%disk_env,$userroles); |
&_add_to_env(\%disk_env,$userroles); |
|
if (ref($firstaccenv) eq 'HASH') { |
|
&_add_to_env(\%disk_env,$firstaccenv); |
|
} |
|
if (ref($timerintenv) eq 'HASH') { |
|
&_add_to_env(\%disk_env,$timerintenv); |
|
} |
if (ref($args->{'extra_env'})) { |
if (ref($args->{'extra_env'})) { |
&_add_to_env(\%disk_env,$args->{'extra_env'}); |
&_add_to_env(\%disk_env,$args->{'extra_env'}); |
} |
} |