--- loncom/interface/londocs.pm 2013/03/17 23:55:01 1.484.2.29
+++ loncom/interface/londocs.pm 2012/05/15 01:23:04 1.486
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Documents
#
-# $Id: londocs.pm,v 1.484.2.29 2013/03/17 23:55:01 raeburn Exp $
+# $Id: londocs.pm,v 1.486 2012/05/15 01:23:04 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,9 +40,7 @@ use Apache::lonxml;
use Apache::lonclonecourse;
use Apache::lonnavmaps;
use Apache::lonnavdisplay();
-use Apache::lonextresedit();
use HTML::Entities;
-use HTML::TokeParser;
use GDBM_File;
use Apache::lonlocal;
use Cwd;
@@ -69,14 +67,10 @@ sub mapread {
}
sub storemap {
- my ($coursenum,$coursedom,$map,$contentchg)=@_;
- my $report;
- if (($contentchg) && ($map =~ /^default/)) {
- $report = 1;
- }
+ my ($coursenum,$coursedom,$map)=@_;
my ($outtext,$errtext)=
&LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
- $map,1,$report);
+ $map,1);
if ($errtext) { return ($errtext,2); }
$hadchanges=1;
@@ -152,7 +146,7 @@ sub dumpcourse {
$r->print(&endContentScreen());
return '';
}
- my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
+ my ($ca,$cd)=split(/\@/,$env{'form.authorspace'});
$r->print('
'.&mt('Copying Files').'
');
my $title=$env{'form.authorfolder'};
$title=&clean($title);
@@ -270,9 +264,7 @@ sub dumpcourse {
sub group_import {
my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
- my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,
- %removeparam,$importuploaded,$fixuperrors);
- $allmaps = {};
+
while (@files) {
my ($name, $url, $residx) = @{ shift(@files) };
if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$})
@@ -289,7 +281,7 @@ sub group_import {
$env{'form.output'}=$newmapstr;
my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
'output',$1.$2);
- if ($result !~ m{^/uploaded/}) {
+ if ($result != m|^/uploaded/|) {
$errtext.='Map not saved: A network error occurred when trying to save the new map. ';
$fatal = 2;
}
@@ -298,24 +290,6 @@ sub group_import {
}
}
if ($url) {
- if (($caller eq 'londocs') &&
- ($folder =~ /^default/)) {
- if (($url =~ /\.(page|sequence)$/) && (!$donechk)) {
- my $chome = &Apache::lonnet::homeserver($coursenum,$coursedom);
- my $cid = $coursedom.'_'.$coursenum;
- $allmaps =
- &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
- $chome,$cid);
- $donechk = 1;
- }
- if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) {
- &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
- \%addedmaps,\%hierarchy,\%titles,$allmaps);
- $importuploaded = 1;
- } elsif ($url =~ m{^/res/.+\.(page|sequence)$}) {
- next if ($allmaps->{$url});
- }
- }
if (!$residx
|| defined($LONCAPA::map::zombies[$residx])) {
$residx = &LONCAPA::map::getresidx($url,$residx);
@@ -325,90 +299,71 @@ sub group_import {
if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
$url = &LONCAPA::map::qtunescape($url);
$name = &LONCAPA::map::qtunescape($name);
- if ($name eq '') {
- $name = &mt('Web Page');
- }
- if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) {
- my $filepath = $1;
- my $fname = $name;
- if ($fname =~ /^\W+$/) {
- $fname = 'web';
- } else {
- $fname =~ s/\W/_/g;
- }
- if (length($fname > 15)) {
- $fname = substr($fname,0,14);
- }
- my $initialtext = &mt('Replace with your own content.');
- my $newhtml = <
-
-
-
-$name
-
-
-$initialtext
-
-
-END
- $env{'form.output'}=$newhtml;
- my $result =
- &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
- 'output',
- "$filepath/$residx/$fname.html");
- if ($result =~ m{^/uploaded/}) {
- $url = $result;
- if ($filepath =~ /^supplemental/) {
- $name = time.'___&&&___'.$env{'user.name'}.'___&&&___'.
- $env{'user.domain'}.'___&&&___'.$name;
- }
- } else {
- return (&mt('Failed to save new web page.'),1);
- }
- }
$LONCAPA::map::resources[$residx] =
join(':', ($name, $url, $ext, 'normal', 'res'));
}
}
- if ($importuploaded) {
- my %import_errors;
- my %updated = (
- removefrommap => \%removefrommap,
- removeparam => \%removeparam,
- );
- my ($result,$msgsarray,$lockerror) =
- &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated);
- if (keys(%import_errors) > 0) {
- $fixuperrors =
- '
'."\n".
- &mt('The following files are either dependencies of a web page or references within a folder and/or composite page for which errors occurred during import:')."\n".
- '
');
@@ -654,7 +587,7 @@ sub docs_change_log {
}
sub update_paste_buffer {
- my ($coursenum,$coursedom,$folder) = @_;
+ my ($coursenum,$coursedom) = @_;
return if (!defined($env{'form.markcopy'}));
return if (!defined($env{'form.copyfolder'}));
@@ -669,691 +602,152 @@ sub update_paste_buffer {
my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
if (&is_supplemental_title($title)) {
&Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title});
- ($title) = &Apache::loncommon::parse_supplemental_title($title);
+ ($title) = &parse_supplemental_title($title);
} elsif ($env{'docs.markedcopy_supplemental'}) {
&Apache::lonnet::delenv('docs.markedcopy_supplemental');
}
$url=~s{http(:|:)//https(:|:)//}{https$2//};
- (my $cmd,undef)=split('_',$env{'form.cmd'});
-
- my %addtoenv = (
- 'docs.markedcopy_title' => $title,
- 'docs.markedcopy_url' => $url,
- 'docs.markedcopy_cmd' => $cmd,
- );
- &Apache::lonnet::delenv('docs.markedcopy_nested');
- &Apache::lonnet::delenv('docs.markedcopy_nestednames');
- if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) {
- my $prefix = $1;
- my $subdir =$2;
- if ($subdir eq '') {
- $subdir = $prefix;
- }
- my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps);
- &contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps,
- \%hierarchy,\%titles,\%allmaps);
- if (ref($hierarchy{$url}) eq 'HASH') {
- my ($nested,$nestednames);
- &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames);
- $nested =~ s/\&$//;
- $nestednames =~ s/\Q___&&&___\E$//;
- if ($nested ne '') {
- $addtoenv{'docs.markedcopy_nested'} = $nested;
- }
- if ($nestednames ne '') {
- $addtoenv{'docs.markedcopy_nestednames'} = $nestednames;
- }
- }
- }
- &Apache::lonnet::appenv(\%addtoenv);
+ &Apache::lonnet::appenv({'docs.markedcopy_title' => $title,
+ 'docs.markedcopy_url' => $url});
delete($env{'form.markcopy'});
}
-sub recurse_uploaded_maps {
- my ($url,$dir,$hierarchy,$titlesref,$nestref,$namesref) = @_;
- if (ref($hierarchy->{$url}) eq 'HASH') {
- my @maps = map { $hierarchy->{$url}{$_}; } sort { $a <=> $b } (keys(%{$hierarchy->{$url}}));
- my @titles = map { $titlesref->{$url}{$_}; } sort { $a <=> $b } (keys(%{$titlesref->{$url}}));
- my (@uploaded,@names,%shorter);
- for (my $i=0; $i<@maps; $i++) {
- my ($inner) = ($maps[$i] =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_(\d+)\.(?:page|sequence)$});
- if ($inner ne '') {
- push(@uploaded,$inner);
- push(@names,&escape($titles[$i]));
- $shorter{$maps[$i]} = $inner;
- }
- }
- $$nestref .= "$dir:".join(',',@uploaded).'&';
- $$namesref .= "$dir:".(join(',',@names)).'___&&&___';
- foreach my $map (@maps) {
- if ($shorter{$map} ne '') {
- &recurse_uploaded_maps($map,$shorter{$map},$hierarchy,$titlesref,$nestref,$namesref);
- }
- }
- }
- return;
-}
-
sub print_paste_buffer {
- my ($r,$container,$folder,$coursedom,$coursenum) = @_;
+ my ($r,$container) = @_;
return if (!defined($env{'docs.markedcopy_url'}));
- my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent);
- my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1];
- if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) {
- $is_external = 1;
- }
-
- my ($canpaste,$nopaste,$othercrs,$areachange);
- if ($folder =~ /^supplemental/) {
- $canpaste = &supp_pasteable($env{'docs.markedcopy_url'});
- unless ($canpaste) {
- $nopaste = &mt('Paste into Supplemental Content unavailable for this type of content.');
- }
- } else {
- $canpaste = 1;
- }
+ $r->print('');
}
-
sub do_paste_from_buffer {
- my ($coursenum,$coursedom,$folder,$container,$errors) = @_;
+ my ($coursenum,$coursedom,$folder) = @_;
-# Early out if paste buffer is empty
if (!$env{'form.pastemarked'}) {
- return ();
- }
-
-# Supplemental content may only include certain types of content
-# Early out if pasted content is not supported in Supplemental area
- if ($folder =~ /^supplemental/) {
- unless (&supp_pasteable($env{'docs.markedcopy_url'})) {
- return (&mt('Paste failed: content type is not supported within Supplemental Content'));
- }
+ return;
}
-# Prepare to paste resource at end of list
+# paste resource to end of list
my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});
my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});
-
- my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges,%tomove);
- if ($url=~/\.(page|sequence)$/) {
- $is_map = 1;
- }
- if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/([^/]+)}) {
- $srcdom = $1;
- $srcnum = $2;
- my $oldprefix = $3;
-# When paste buffer was populated using an active role in a different course
-# check for mdc privilege in the course from which the resource was pasted
- if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
- unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
- return (&mt('Paste failed: Item is from a different course which you do not have rights to edit.'));
+# Maps need to be copied first
+ if (($url=~/\.(page|sequence)$/) && ($url=~/^\/uploaded\//)) {
+ $title=&mt('Copy of').' '.$title;
+ my $newid=$$.int(rand(100)).time;
+ my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);
+ if ($oldid =~ m{^(/uploaded/\Q$coursedom\E/\Q$coursenum\E/)(\D+)(\d+)$}) {
+ my $path = $1;
+ my $prefix = $2;
+ my $ancestor = $3;
+ if (length($ancestor) > 10) {
+ $ancestor = substr($ancestor,-10,10);
}
+ $oldid = $path.$prefix.$ancestor;
}
-# When pasting content from Main Content to Supplemental Content and vice versa
-# URLs will contain different paths (which depend on whether pasted item is
-# a folder/page or a document.
- if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {
- $prefixchg = 1;
- %before = ( map => 'default',
- doc => 'docs');
- %after = ( map => 'supplemental',
- doc => 'supplemental' );
- } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {
- $prefixchg = 1;
- %before = ( map => 'supplemental',
- doc => 'supplemental');
- %after = ( map => 'default',
- doc => 'docs');
- }
-
-# If pasting an uploaded map, get list of contained uploaded maps.
- my @nested;
- if ($env{'docs.markedcopy_nested'}) {
- my ($type) = ($oldprefix =~ /^(default|supplemental)/);
- my @items = split(/\&/,$env{'docs.markedcopy_nested'});
- my @deps = map { /\d+:([\d,]+$)/ } @items;
- foreach my $dep (@deps) {
- if ($dep =~ /,/) {
- push(@nested,split(/,/,$dep));
- } else {
- push(@nested,$dep);
- }
- }
- foreach my $item (@nested) {
- if ($env{'form.docs.markedcopy_'.$item} eq 'move') {
- $tomove{$type.'_'.$item} = 1;
- }
- }
+ my $counter = 0;
+ my $newurl=$oldid.$newid.'.'.$ext;
+ my $is_unique = &uniqueness_check($newurl);
+ while (!$is_unique && $counter < 100) {
+ $counter ++;
+ $newid ++;
+ $newurl = $oldid.$newid;
+ $is_unique = &uniqueness_check($newurl);
}
- }
-
-# Maps need to be copied first
- my ($oldurl,%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,
- %dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls);
- $oldurl = $url;
- if ($is_map) {
-# If pasting a map, check if map contains other maps
- my ($allmaps,%hierarchy,%titles);
- $allmaps = {};
- if ($folder =~ /^default/) {
- $allmaps =
- &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
- $env{"course.$env{'request.course.id'}.home"},
- $env{'request.course.id'});
- }
- &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
- \%addedmaps,\%hierarchy,\%titles,$allmaps);
- if ($url=~ m{^/uploaded/}) {
- my $newurl;
- unless ($env{'form.docs.markedcopy_options'} eq 'move') {
- ($newurl,my $error) =
- &get_newmap_url($url,$folder,$prefixchg,$coursedom,$coursenum,
- $srcdom,$srcnum,\$title,$allmaps,\%newurls);
- if ($error) {
- return ($error);
- }
- if ($newurl ne '') {
- if ($newurl ne $url) {
- if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) {
- $newsubdir{$url} = $1;
- }
- $mapchanges{$url} = 1;
- }
- }
- }
- if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||
- (($newurl ne '') && ($newurl ne $url))) {
- unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,
- $coursenum,$srcdom,$srcnum,$allmaps,
- \%rewrites,\%retitles,\%copies,\%dbcopies,
- \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove,
- \%newsubdir,\%newurls)) {
- $mapmoves{$url} = 1;
- }
- $url = $newurl;
- } elsif ($env{'docs.markedcopy_nested'}) {
- &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,
- $srcdom,$srcnum,$allmaps,\%rewrites,
- \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves,
- \%mapchanges,\%tomove,\%newsubdir,\%newurls);
- }
- } elsif ($url=~m {^/res/}) {
-# published maps can only exists once, so remove it from paste buffer when done
- &Apache::lonnet::delenv('docs.markedcopy');
-# if pasting published map (main content are only) check map is not already in course
- if ($folder =~ /^default/) {
- if ((ref($allmaps) eq 'HASH') && ($allmaps->{$url})) {
- return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.'));
- }
+ if (!$is_unique) {
+ if ($url=~/\.page$/) {
+ return &mt('Paste failed: an error occurred creating a unique URL for the composite page');
+ } else {
+ return &mt('Paste failed: an error occurred creating a unique URL for the folder');
}
}
- }
- my $lockerrors;
- if ($url=~ m{/(bulletinboard|smppg)$}) {
- my $prefix = $1;
- #need to copy the db contents to a new one, unless this is a move.
- my %info = (
- src => $url,
- cdom => $coursedom,
- cnum => $coursenum,
- );
- my (%lockerr,$msg);
- unless ($env{'form.docs.markedcopy_options'} eq 'move') {
- my ($newurl,$result,$errtext) =
- &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);
- if ($result eq 'ok') {
- $url = $newurl;
- $title=&mt('Copy of').' '.$title;
+ my $storefn=$newurl;
+ $storefn=~s{^/\w+/$match_domain/$match_username/}{};
+ my $paste_map_result =
+ &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
+ &Apache::lonnet::getfile($url));
+ if ($paste_map_result eq '/adm/notfound.html') {
+ if ($url=~/\.page$/) {
+ return &mt('Paste failed: an error occurred saving the composite page');
} else {
- if ($prefix eq 'smppg') {
- $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext;
- } elsif ($prefix eq 'bulletinboard') {
- $msg = &mt('Paste failed: An error occurred when copying the bulletin board.').' '.$errtext;
- }
- return ($result,undef,[$msg],$lockerr{$prefix});
- }
- if ($lockerr{$prefix}) {
- $lockerrors = $lockerr{$prefix};
+ return &mt('Paste failed: an error occurred saving the folder');
}
}
+ $url = $newurl;
+ }
+# published maps can only exists once, so remove it from paste buffer when done
+ if (($url=~/\.(page|sequence)$/) && ($url=~m {^/res/})) {
+ &Apache::lonnet::delenv('docs.markedcopy');
+ }
+ if ($url=~ m{/smppg$}) {
+ my $db_name = &Apache::lonsimplepage::get_db_name($url);
+ if ($db_name =~ /^smppage_/) {
+ #simple pages, need to copy the db contents to a new one.
+ my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
+ my $now = time();
+ $db_name =~ s{_\d*$ }{_$now}x;
+ my $result=&Apache::lonnet::put($db_name,\%contents,
+ $coursedom,$coursenum);
+ $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
+ $title=&mt('Copy of').' '.$title;
+ }
}
$title = &LONCAPA::map::qtunescape($title);
my $ext='false';
if ($url=~m{^http(|s)://}) { $ext='true'; }
$url = &LONCAPA::map::qtunescape($url);
-
-# For uploaded files (excluding pages/sequences) path in copied file is changed
-# if paste is from Main to Supplemental (or vice versa), or if pasting between
-# courses.
-
- my $newidx;
- unless ($is_map) {
# Now insert the URL at the bottom
- $newidx = &LONCAPA::map::getresidx($url);
- if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {
- my $relpath = $1;
- if ($relpath ne '') {
- my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});
- my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);
- my $newprefix = $newloc;
- if ($newloc eq 'default') {
- $newprefix = 'docs';
- }
- if ($newdocsdir eq '') {
- $newdocsdir = 'default';
- }
- if (($prefixchg) ||
- ($srcdom ne $coursedom) || ($srcnum ne $coursenum) ||
- ($env{'form.docs.markedcopy_options'} ne 'move')) {
- my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";
- $url =
- &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
- &Apache::lonnet::getfile($oldurl));
- if ($url eq '/adm/notfound.html') {
- return (&mt('Paste failed: an error occurred saving the file.'));
- } else {
- my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$});
- $newsubpath =~ s{/+$}{/};
- $docmoves{$oldurl} = $newsubpath;
- }
- }
- }
- }
- }
-# Apply any changes to maps, or copy dependencies for uploaded HTML pages
- my ($result,$save_err);
- my %updated = (
- rewrites => \%rewrites,
- zombies => \%zombies,
- removefrommap => \%removefrommap,
- removeparam => \%removeparam,
- dbcopies => \%dbcopies,
- retitles => \%retitles,
- );
- my %info = (
- newsubdir => \%newsubdir,
- params => \%params,
- before => \%before,
- after => \%after,
- );
- my %moves = (
- copies => \%copies,
- docmoves => \%docmoves,
- mapmoves => \%mapmoves,
- );
- ($result,my $msgsarray,my $lockerror) =
- &apply_fixups($folder,$is_map,$coursedom,$coursenum,$errors,
- \%updated,\%info,\%moves,$prefixchg,$oldurl,$url,'paste');
- $lockerrors .= $lockerror;
- if ($result eq 'ok') {
- if ($is_map) {
- my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
- $folder.'.'.$container);
- return ($errtext,$save_err,$msgsarray,$lockerrors) if ($fatal);
-
- if ($#LONCAPA::map::order<1) {
- my $idx=&LONCAPA::map::getresidx();
- if ($idx<=0) { $idx=1; }
- $LONCAPA::map::order[0]=$idx;
- $LONCAPA::map::resources[$idx]='';
- }
- $newidx = &LONCAPA::map::getresidx($url);
- }
- if ($env{'docs.markedcopy_supplemental'}) {
- if ($folder !~ /^supplemental/) {
- (undef,undef,$title) =
- &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'});
- }
- } else {
- if ($folder=~/^supplemental/) {
- $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
- $env{'user.domain'}.'___&&&___'.$title;
- }
- }
- $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';
- push(@LONCAPA::map::order, $newidx);
-
-# Store the result
- my ($errtext,$fatal) =
- &storemap($coursenum,$coursedom,$folder.'.'.$container,1);
- if ($fatal) {
- $save_err = $errtext;
- }
- }
-
- if ($env{'form.docs.markedcopy_options'} eq 'move') {
- &Apache::lonnet::delenv('docs.markedcopy');
- &Apache::lonnet::delenv('docs.markedcopy_nested');
- &Apache::lonnet::delenv('docs.markedcopy_nestednames');
- }
- return ($result,$save_err,$msgsarray,$lockerrors);
-}
-
-sub get_newmap_url {
- my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum,
- $titleref,$allmaps,$newurls) = @_;
- my $newurl;
- if ($url=~ m{^/uploaded/}) {
- $$titleref=&mt('Copy of').' '.$$titleref;
- }
- my $now = time;
- my $suffix=$$.int(rand(100)).$now;
- my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);
- if ($oldid =~ m{^(/uploaded/$match_domain/$match_courseid/)(\D+)(\d+)$}) {
- my $path = $1;
- my $prefix = $2;
- my $ancestor = $3;
- if (length($ancestor) > 10) {
- $ancestor = substr($ancestor,-10,10);
- }
- my $newid;
- if ($prefixchg) {
- if ($folder =~ /^supplemental/) {
- $prefix =~ s/^default/supplemental/;
- } else {
- $prefix =~ s/^supplemental/default/;
- }
- }
- if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) {
- $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext;
+ my $newidx = &LONCAPA::map::getresidx($url);
+ if ($env{'docs.markedcopy_supplemental'}) {
+ if ($folder =~ /^supplemental/) {
+ $title = $env{'docs.markedcopy_supplemental'};
} else {
- $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$now.'.'.$ext;
- }
- my $counter = 0;
- my $is_unique = &uniqueness_check($newurl);
- if ($folder =~ /^default/) {
- if ($allmaps->{$newurl}) {
- $is_unique = 0;
- }
- }
- while ((!$is_unique || $allmaps->{$newurl} || $newurls->{$newurl}) && ($counter < 100)) {
- $counter ++;
- $suffix ++;
- if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) {
- $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext;
- } else {
- $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$ancestor.$suffix.'.'.$ext;
- }
- $is_unique = &uniqueness_check($newurl);
+ (undef,undef,$title) =
+ &parse_supplemental_title($env{'docs.markedcopy_supplemental'});
}
- if ($is_unique) {
- $newurls->{$newurl} = 1;
- } else {
- if ($url=~/\.page$/) {
- return (undef,&mt('Paste failed: an error occurred creating a unique URL for the composite page'));
- } else {
- return (undef,&mt('Paste failed: an error occurred creating a unique URL for the folder'));
- }
+ } else {
+ if ($folder=~/^supplemental/) {
+ $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
+ $env{'user.domain'}.'___&&&___'.$title;
}
}
- return ($newurl);
-}
-sub dbcopy {
- my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;
- my ($url,$result,$errtext);
- my $url = $dbref->{'src'};
- if (ref($dbref) eq 'HASH') {
- if ($url =~ m{/(smppg|bulletinboard)$}) {
- my $prefix = $1;
- if (($dbref->{'cdom'} =~ /^$match_domain$/) &&
- ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
- my $db_name;
- my $marker = (split(m{/},$url))[4];
- $marker=~s/\D//g;
- if ($dbref->{'src'} =~ m{/smppg$}) {
- $db_name =
- &Apache::lonsimplepage::get_db_name($url,$marker,
- $dbref->{'cdom'},
- $dbref->{'cnum'});
- } else {
- $db_name = 'bulletinpage_'.$marker;
- }
- my ($suffix,$freedlock,$error) =
- &Apache::lonnet::get_timebased_id($prefix,'num','templated',
- $coursedom,$coursenum,
- 'concat');
- if (!$suffix) {
- if ($prefix eq 'smppg') {
- $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url);
- } else {
- $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a bulletin board [_1].',$url);
- }
- if ($error) {
- $errtext .= ' '.$error;
- }
- } else {
- #need to copy the db contents to a new one.
- my %contents=&Apache::lonnet::dump($db_name,
- $dbref->{'cdom'},
- $dbref->{'cnum'});
- if (exists($contents{'uploaded.photourl'})) {
- my $photo = $contents{'uploaded.photourl'};
- my ($subdir,$fname) =
- ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$});
- my $newphoto;
- if ($fname ne '') {
- my $content = &Apache::lonnet::getfile($photo);
- unless ($content eq '-1') {
- $env{'form.'.$suffix.'.photourl'} = $content;
- $newphoto =
- &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname");
- delete($env{'form.'.$suffix.'.photourl'});
- }
- }
- if ($newphoto =~ m{^/uploaded/}) {
- $contents{'uploaded.photourl'} = $newphoto;
- }
- }
- $db_name =~ s{_\d*$ }{_$suffix}x;
- $result=&Apache::lonnet::put($db_name,\%contents,
- $coursedom,$coursenum);
- if ($result eq 'ok') {
- $url =~ s{/(\d*)/(smppg|bulletinboard)$}{/$suffix/$2}x;
- }
- }
- if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {
- $lockerrorsref->{$prefix} =
- '
'.
- &mt('There was a problem removing a lockfile.');
- if ($prefix eq 'smppg') {
- $lockerrorsref->{$prefix} .=
- &mt('This will prevent creation of additional simple pages in this course.');
- } else {
- $lockerrorsref->{$prefix} .= &mt('This will prevent creation of additional bulletin boards in this course.');
- }
- $lockerrorsref->{$prefix} .= &mt('Please contact the domain coordinator for your LON-CAPA domain.').'
');
- }
- if ($save_error ne '') {
- return $save_error;
- }
- if ($paste_res ne 'ok') {
+ my $paste_res =
+ &do_paste_from_buffer($coursenum,$coursedom,$folder);
+ if ($paste_res eq 'ok') {
+ ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container);
+ return $errtext if ($fatal);
+ } elsif ($paste_res ne '') {
$r->print('
'.$paste_res.'
');
}
- if (keys(%paste_errors) > 0) {
- $r->print('
'."\n".
- &mt('The following files are either dependencies of a web page or references within a folder and/or composite page which could not be copied during the paste operation:')."\n".
- '
'."\n");
- foreach my $key (sort(keys(%paste_errors))) {
- $r->print('
'.$key.'
'."\n");
- }
- $r->print('
'."\n");
- }
}
$r->print($upload_output);
if (&handle_edit_cmd()) {
- my $contentchg;
- if ($env{'form.cmd'} =~ /^(del|cut)_/) {
- $contentchg = 1;
- }
- ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg);
+ ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
return $errtext if ($fatal);
}
# Group import/search
@@ -2131,57 +906,13 @@ sub editor {
foreach my $item (split(/\&/,$env{'form.importdetail'})) {
if (defined($item)) {
my ($name,$url,$residx)=
- map { &unescape($_); } split(/\=/,$item);
- if ($url =~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) {
- my ($suffix,$errortxt,$locknotfreed) =
- &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2);
- if ($locknotfreed) {
- $r->print($locknotfreed);
- }
- if ($suffix) {
- $url =~ s/_new\./_$suffix./;
- } else {
- return $errortxt;
- }
- } elsif ($url =~ m{^/adm/$match_domain/$match_username/new/(smppg|bulletinboard)$}) {
- my $type = $1;
- my ($suffix,$errortxt,$locknotfreed) =
- &new_timebased_suffix($coursedom,$coursenum,$type);
- if ($locknotfreed) {
- $r->print($locknotfreed);
- }
- if ($suffix) {
- $url =~ s{^(/adm/$match_domain/$match_username)/new}{$1/$suffix};
- } else {
- return $errortxt;
- }
- } elsif ($url =~ m{^/uploaded/$coursedom/$coursenum/(docs|supplemental)/(default|\d+)/new.html$}) {
- if ($supplementalflag) {
- next unless ($1 eq 'supplemental');
- if ($folder eq 'supplemental') {
- next unless ($2 eq 'default');
- } else {
- next unless ($folder eq 'supplemental_'.$2);
- }
- } else {
- next unless ($1 eq 'docs');
- if ($folder eq 'default') {
- next unless ($2 eq 'default');
- } else {
- next unless ($folder eq 'default_'.$2);
- }
- }
- }
+ map {&unescape($_)} split(/\=/,$item);
push(@imports, [$name, $url, $residx]);
}
}
- ($errtext,$fatal,my $fixuperrors) =
- &group_import($coursenum, $coursedom, $folder,$container,
- 'londocs',@imports);
+ ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
+ $container,'londocs',@imports);
return $errtext if ($fatal);
- if ($fixuperrors) {
- $r->print($fixuperrors);
- }
}
# Loading a complete map
if ($env{'form.loadmap'}) {
@@ -2193,7 +924,7 @@ sub editor {
$LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
}
($errtext,$fatal)=&storemap($coursenum,$coursedom,
- $folder.'.'.$container,1);
+ $folder.'.'.$container);
return $errtext if ($fatal);
} else {
$r->print('
'.&mt('No map selected.').'
');
@@ -2237,7 +968,7 @@ sub editor {
$r->print('');
}
- my ($to_show,$output,@allidx,@allmapidx);
+ my ($to_show,$output);
&Apache::loncommon::start_data_table_count(); #setup a row counter
foreach my $res (@LONCAPA::map::order) {
@@ -2246,113 +977,36 @@ sub editor {
$url=&LONCAPA::map::qtescape($url);
unless ($name) { $name=(split(/\//,$url))[-1]; }
unless ($name) { $idx++; next; }
- push(@allidx,$res);
- if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {
- push(@allmapidx,$res);
- }
$output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
- $coursenum,$coursedom,$crstype,
- $pathitem,$supplementalflag,$container);
+ $coursenum,$crstype);
$idx++;
$shown++;
}
&Apache::loncommon::end_data_table_count();
-
- if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) {
- my $toolslink = '
'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'
';
- return;
- }
# this is for a course, not a user, so set context to coursedoc.
my $newidx=&LONCAPA::map::getresidx();
$destination .= $newidx;
@@ -2437,7 +1104,7 @@ sub process_file_upload {
$comment.':'.$url.':'.$ext.':normal:res';
$LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
($errtext,$fatal)=&storemap($coursenum,$coursedom,
- $folder.'.'.$container,1);
+ $folder.'.'.$container);
if ($fatal) {
$$upload_output = '
'.$errtext.'
';
return;
@@ -2474,6 +1141,7 @@ sub process_file_upload {
my $archiveurl = &HTML::Entities::encode($url,'<>&"');
my %archiveitems = (
folderpath => $env{'form.folderpath'},
+ pagepath => $env{'form.pagepath'},
cmd => $nextphase,
newidx => $newidx,
position => $position,
@@ -2524,51 +1192,68 @@ sub is_supplemental_title {
return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/);
}
+sub parse_supplemental_title {
+ my ($title) = @_;
+
+ my ($foldertitle,$renametitle);
+ if ($title =~ /&&&/) {
+ $title = &HTML::Entites::decode($title);
+ }
+ if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) {
+ $renametitle=$4;
+ my ($time,$uname,$udom) = ($1,$2,$3);
+ $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
+ my $name = &Apache::loncommon::plainname($uname,$udom);
+ $name = &HTML::Entities::encode($name,'"<>&\'');
+ $renametitle = &HTML::Entities::encode($renametitle,'"<>&\'');
+ $title=''.&Apache::lonlocal::locallocaltime($time).' '.
+ $name.': '.$foldertitle;
+ }
+ if (wantarray) {
+ return ($title,$foldertitle,$renametitle);
+ }
+ return $title;
+}
+
# --------------------------------------------------------------- An entry line
sub entryline {
- my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
- $crstype,$pathitem,$supplementalflag,$container)=@_;
- my ($foldertitle,$renametitle);
+ my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_;
+ my ($foldertitle,$pagetitle,$renametitle);
if (&is_supplemental_title($title)) {
- ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);
+ ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title);
+ $pagetitle = $foldertitle;
} else {
$title=&HTML::Entities::encode($title,'"<>&\'');
$renametitle=$title;
$foldertitle=$title;
+ $pagetitle=$title;
}
my $orderidx=$LONCAPA::map::order[$index];
+
$renametitle=~s/\\/\\\\/g;
$renametitle=~s/\"\;/\\\"/g;
$renametitle=~s/ /%20/g;
my $line=&Apache::loncommon::start_data_table_row();
my ($form_start,$form_end,$form_common);
# Edit commands
- my ($esc_path, $path, $symb);
+ my ($container, $type, $esc_path, $path, $symb);
if ($env{'form.folderpath'}) {
+ $type = 'folder';
+ $container = 'sequence';
$esc_path=&escape($env{'form.folderpath'});
$path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
# $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
}
- my $isexternal;
- if ($residx) {
- my $currurl = $url;
- $currurl =~ s{^http(|s)(:|:)//}{/adm/wrapper/ext/};
- if ($currurl =~ m{^/adm/wrapper/ext/}) {
- $isexternal = 1;
- }
- if (!$supplementalflag) {
- my $path = 'uploaded/'.
- $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
- $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
- $symb = &Apache::lonnet::encode_symb($path.$folder.".$container",
- $residx,
- &Apache::lonnet::declutter($currurl));
- }
+ if ($env{'form.pagepath'}) {
+ $type = $container = 'page';
+ $esc_path=&escape($env{'form.pagepath'});
+ $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
+ $symb=&escape($env{'form.pagesymb'});
}
- my ($renamelink,%lt);
+ my $cpinfo='';
if ($allowed) {
my $incindex=$index+1;
my $selectbox='';
@@ -2591,81 +1276,36 @@ sub entryline {
}
$selectbox.='';
}
- %lt=&Apache::lonlocal::texthash(
+ my %lt=&Apache::lonlocal::texthash(
'up' => 'Move Up',
'dw' => 'Move Down',
'rm' => 'Remove',
'ct' => 'Cut',
'rn' => 'Rename',
- 'cp' => 'Copy',
- 'ex' => 'External Resource',
- 'ed' => 'Edit',
- 'pr' => 'Preview',
- 'sv' => 'Save',
- 'ul' => 'URL',
- 'ti' => 'Title',
- );
+ 'cp' => 'Copy');
my $nocopy=0;
my $nocut=0;
- my $noremove=0;
- if ($url=~ m{^/res/.+\.(page|sequence)$}) {
- # no copy for published maps
- $nocopy=1;
+ if ($url=~/\.(page|sequence)$/) {
+ if ($url =~ m{/res/}) {
+ # no copy for published maps
+ $nocopy = 1;
+ } else {
+ foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) {
+ my ($title,$url,$ext,$type)=split(/\:/,$item);
+ if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
+ $nocopy=1;
+ last;
+ }
+ }
+ }
}
if ($url=~/^\/res\/lib\/templates\//) {
$nocopy=1;
$nocut=1;
}
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- if ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") {
- if ($env{'form.folderpath'} =~ /^default&[^\&]+$/) {
- my %curr_groups = &Apache::longroup::coursegroups();
- if (keys(%curr_groups) > 0) {
- $noremove=1;
- }
- $nocut=1;
- $nocopy=1;
- }
- } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) {
- my $group = $1;
- if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) {
- my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
- if (keys(%curr_group) > 0) {
- $noremove=1;
- }
- }
- $nocut=1;
- $nocopy=1;
- } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) {
- my $group = $1;
- if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) {
- my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
- my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group});
- if (keys(%groupsettings) > 0) {
- $noremove=1;
- }
- $nocut=1;
- $nocopy=1;
- }
- } elsif ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) {
- my $group = $1;
- my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
- if ($url =~ /group_boards_\Q$group\E/) {
- my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
- my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group});
- if (keys(%groupsettings) > 0) {
- if (ref($groupsettings{'functions'}) eq 'HASH') {
- if ($groupsettings{'functions'}{'discussion'} eq 'on') {
- $noremove=1;
- }
- }
- }
- $nocut=1;
- $nocopy=1;
- }
- }
- my ($copylink,$cutlink,$removelink);
+ my $copylink=' ';
+ my $cutlink=' ';
+
my $skip_confirm = 0;
if ( $folder =~ /^supplemental/
|| ($url =~ m{( /smppg$
@@ -2673,49 +1313,27 @@ sub entryline {
|/aboutme$
|/navmaps$
|/bulletinboard$
- |\.html$)}x)
- || $isexternal) {
+ |\.html$
+ |^/adm/wrapper/ext)}x)) {
$skip_confirm = 1;
}
- if ($nocopy) {
- $copylink=(<$lt{'cp'}
-ENDCOPY
- } else {
+ if (!$nocopy) {
$copylink=(<$lt{'cp'}
+$lt{'cp'}
ENDCOPY
}
- if ($nocut) {
- $cutlink=(<$lt{'ct'}
-ENDCUT
- } else {
+ if (!$nocut) {
$cutlink=(<$lt{'ct'}
+$lt{'ct'}
ENDCUT
}
- if ($noremove) {
- $removelink=(<$lt{'rm'}
-ENDREM
- } else {
- $removelink=(<$lt{'rm'}
-ENDREM
- }
- unless ($isexternal) {
- $renamelink=(<$lt{'rn'}
-ENDREN
- }
$form_start = '
';
$form_common=(<
-
+
+
END
@@ -2723,13 +1341,13 @@ END
$line.=(<
";
+ $line.=$external."";
$rand_pick_text = ' ' if ($rand_pick_text eq '');
$rand_order_text = ' ' if ($rand_order_text eq '');
if (($allowed) && ($folder!~/^supplemental/)) {
@@ -2923,18 +1534,16 @@ $form_end;
((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':'');
my $hidtext=
((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':'');
- my $formhidden = 'edit_hiddenresource_'.$orderidx;
- my $formurlhidden = 'edit_encrypturl_'.$orderidx;
$line.=(<
-
+ $form_start
$form_common
-
+
$form_end
-
+ $form_start
$form_common
-
+
$form_end
$rand_pick_text
@@ -2945,56 +1554,6 @@ ENDPARMS
return $line;
}
-sub new_timebased_suffix {
- my ($coursedom,$coursenum,$type,$area,$container) = @_;
- my ($prefix,$namespace,$idtype,$errtext,$locknotfreed);
- if ($type eq 'map') {
- $prefix = 'docs';
- if ($area eq 'supplemental') {
- $prefix = 'supp';
- }
- $prefix .= $container;
- $namespace = 'uploadedmaps';
- } else {
- $prefix = $type;
- $namespace = 'templated';
- }
- $idtype = 'concat';
- my ($suffix,$freedlock,$error) =
- &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,
- $coursedom,$coursenum);
- if (!$suffix) {
- if ($type eq 'map') {
- $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');
- } elsif ($type eq 'smppg') {
- $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.');
- } else {
- $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new bulletin board.');
- }
- if ($error) {
- $errtext .= ' '.$error;
- }
- }
- if ($freedlock ne 'ok') {
- $locknotfreed =
- '
'.
- &mt('There was a problem removing a lockfile.').' ';
- if ($type eq 'map') {
- &mt('This will prevent creation of additional folders or composite pages in this course.');
- } elsif ($type eq 'smppg') {
- $locknotfreed .=
- &mt('This will prevent creation of additional simple pages in this course.');
- } else {
- $locknotfreed .=
- &mt('This will prevent creation of additional bulletin boards in this course.');
- }
- $locknotfreed .=
- ' '.&mt('Please contact the domain coordinator for your LON-CAPA domain.').
- '
');
- $r->print(&endContentScreen());
}
@@ -3257,7 +1814,7 @@ sub checkversions {
if ($env{'form.timerange'} eq 'all') {
# show all documents
$header=&mt('All Documents in '.$crstype);
- $allsel=' selected="selected"';
+ $allsel=1;
foreach my $key (keys(%hash)) {
if ($key=~/^ids\_(\/res\/.+)$/) {
my $src=$1;
@@ -3278,19 +1835,19 @@ sub checkversions {
.&mt('seconds');
if ($env{'form.timerange'}==-1) {
$seltext='since start of course';
- $startsel=' selected="selected"';
+ $startsel='selected';
$env{'form.timerange'}=time;
}
$starttime=time-$env{'form.timerange'};
if ($env{'form.timerange'}==2592000) {
$seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
- $monthsel=' selected="selected"';
+ $monthsel='selected';
} elsif ($env{'form.timerange'}==604800) {
$seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
- $weeksel=' selected="selected"';
+ $weeksel='selected';
} elsif ($env{'form.timerange'}==86400) {
$seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
- $daysel=' selected="selected"';
+ $daysel='selected';
}
$header=&mt('Content changed').' '.$seltext;
} else {
@@ -3328,11 +1885,11 @@ sub checkversions {
@@ -3348,93 +1905,110 @@ $lt{'sc'}:
+
ENDHEADERS
#number of columns for version history
+ my $num_ver_col = 1;
$r->print(
- &Apache::loncommon::start_data_table().
- &Apache::loncommon::start_data_table_header_row().
- '
'.
+ '');
foreach my $key (sort(keys(%changes))) {
- #excludes not versionable problems from resource version history:
- next unless ($changes{$key}>$starttime && $key !~ /^\/res\/lib\/templates/);
- my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
- my $currentversion=&Apache::lonnet::getversion($key);
- if ($currentversion<0) {
- $currentversion=''.&mt('Could not be determined.').'';
- }
- my $linkurl=&Apache::lonnet::clutter($key);
+ if ($changes{$key}>$starttime) {
+ my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
+ my $currentversion=&Apache::lonnet::getversion($key);
+ if ($currentversion<0) {
+ $currentversion=''.&mt('Could not be determined.').'';
+ }
+ my $linkurl=&Apache::lonnet::clutter($key);
$r->print(
+ &Apache::loncommon::end_data_table_header_row().
&Apache::loncommon::start_data_table_row().
- '
'
- );
- # Used in course
- my $usedversion=$hash{'version_'.$linkurl};
- if (($usedversion) && ($usedversion ne 'mostrecent')) {
- if ($usedversion != $currentversion) {
+ '
');
+# Used in course
+ my $usedversion=$hash{'version_'.$linkurl};
+ if (($usedversion) && ($usedversion ne 'mostrecent')) {
+ if($usedversion != $currentversion){
$r->print(''.$usedversion.'');
- } else {
+ }else{
$r->print($usedversion);
}
+ } else {
+ $r->print($currentversion);
+ }
+ $r->print('
');
+# Set version
+ $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
+ 'set_version_'.$linkurl,
+ {'select_form_order' =>
+ ['',1..$currentversion,'mostrecent'],
+ '' => '',
+ 'mostrecent' => &mt('most recent'),
+ map {$_,$_} (1..$currentversion)}));
+ my $lastold=1;
+ for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
+ my $url=$root.'.'.$prevvers.'.'.$extension;
+ if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
+ $starttime) {
+ $lastold=$prevvers;
+ }
+ }
+ #
+ # Code to figure out how many version entries should go in
+ # each of the four columns
+ my $entries_per_col = 0;
+ my $num_entries = ($currentversion-$lastold);
+ if ($num_entries % $num_ver_col == 0) {
+ $entries_per_col = $num_entries/$num_ver_col;
} else {
- $r->print($currentversion);
- }
- $r->print('
');
- # Set version
- $r->print(&Apache::loncommon::select_form(
- $setversions{$linkurl},
- 'set_version_'.$linkurl,
- {'select_form_order' => ['',1..$currentversion,'mostrecent'],
- '' => '',
- 'mostrecent' => &mt('most recent'),
- map {$_,$_} (1..$currentversion)}));
- my $lastold=1;
- for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
- my $url=$root.'.'.$prevvers.'.'.$extension;
- if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {
- $lastold=$prevvers;
+ $entries_per_col = $num_entries/$num_ver_col + 1;
}
- }
- $r->print('