--- loncom/imspackages/imsimportdocs.pm 2004/03/09 16:34:34 1.2 +++ loncom/imspackages/imsimportdocs.pm 2005/10/27 17:07:23 1.13 @@ -1,3 +1,26 @@ +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# + package Apache::imsimportdocs; use Apache::Constants qw(:common :http :methods); @@ -44,8 +67,8 @@ function setOptions(caller,itemnum) { if (caller == "board") { opForm.elements[menu].options[0] = new Option("Select","-1",true,true) opForm.elements[menu].options[1] = new Option("Import topics only","topics",true,true) - opForm.elements[menu].options[2] = new Option("Import topics & posts (with author)","allpost",true,true) - opForm.elements[menu].options[3] = new Option("Import topics & posts (no author)","allanon",true,true) + opForm.elements[menu].options[2] = new Option("Import topics + posts (with author)","allpost",true,true) + opForm.elements[menu].options[3] = new Option("Import topics + posts (no author)","allanon",true,true) } else { if (caller == "users") { @@ -114,47 +137,28 @@ sub handler { $r->send_http_header; return OK if $r->header_only; - my @areas = ("doc","extlink","announce","staff","board","quiz","survey","pool","users"); + my @areas = (); my %cmsmap = (); - %{$cmsmap{bb5}} = ( - announce => 'resource/x-bb-announcement', - board => 'resource/x-bb-discussionboard', - doc => 'resource/x-bb-document', - extlink => 'resource/x-bb-externallink', - pool => 'assessment/x-bb-pool', - quiz => 'assessment/x-bb-quiz', - staff => 'resource/x-bb-staffinfo', - survey => 'assessment/x-bb-survey', - users => 'course/x-bb-user', - ); - - %{$cmsmap{angel}} = ( - board => 'BOARD', - extlink => 'LINK', - msg => 'MESSAGE', - quiz => 'QUIZ', - survey => 'FORM', - ); - - @{$cmsmap{angel}{doc}} = ('FILE','PAGE'); + my %areaname = (); + &Apache::imsprocessor::ims_config(\@areas,\%cmsmap,\%areaname); # get course data - my $coursenum=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; - my $coursedom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; - my $coursehome=$ENV{'course.'.$ENV{'request.course.id'}.'.home'}; + my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'}; + my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; + my $coursehome=$env{'course.'.$env{'request.course.id'}.'.home'}; # get personal data - my $uname=$ENV{'user.name'}; - my $udom=$ENV{'user.domain'}; + my $uname=$env{'user.name'}; + my $udom=$env{'user.domain'}; my $plainname=&Apache::lonnet::escape( &Apache::loncommon::plainname($uname,$udom)); # does this user have privileges to post, etc? - my $allowed=&Apache::lonnet::allowed('mdc',$ENV{'request.course.id'}); + my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); unless ($allowed) { $r->print("The LearningOnline Network with CAPA"); - $r->print(&Apache::loncommon::bodytag('Import IMS package')); + $r->print(&Apache::loncommon::bodytag('Import IMS package',undef,'',1)); $r->print('

'.&mt('Modification of Course Contents Disallowed').'

'.&mt('Your current role does not grant you the right to modify course content in this course.').''); return OK; } @@ -162,11 +166,11 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['phase']); - if ($ENV{'form.phase'} eq 'one') { + if ($env{'form.phase'} eq 'one') { &jscript_one(\$javascript); - } elsif ($ENV{'form.phase'} eq 'two') { + } elsif ($env{'form.phase'} eq 'two') { &jscript_two(\$javascript); - } elsif ($ENV{'form.phase'} eq 'three') { + } elsif ($env{'form.phase'} eq 'three') { &jscript_three(\$javascript); } @@ -183,39 +187,18 @@ $javascript ENDHEAD # -------------------------------------------------------------------- Body tag - $r->print(&Apache::loncommon::bodytag('Import IMS package')); - if ($ENV{'form.phase'} eq 'one') { + $r->print(&Apache::loncommon::bodytag('Import IMS package',undef,'',1)); + if ($env{'form.phase'} eq 'one') { &display_one($r); - } elsif ($ENV{'form.phase'} eq 'two') { - &display_two($r,$coursenum,\@areas,%cmsmap); - } elsif ($ENV{'form.phase'} eq 'three') { + } elsif ($env{'form.phase'} eq 'two') { + &display_two($r,$coursenum,\@areas,\%areaname,%cmsmap); + } elsif ($env{'form.phase'} eq 'three') { &display_three($r,$coursenum,$coursedom,$coursehome,$uname,$udom,\@areas,%cmsmap); } $r->print(""); return OK; } -sub uploadzip { - my $tempdir = shift; - my $fname=$ENV{'form.uploadname.filename'}; -# Replace Windows backslashes by forward slashes - $fname=~s/\\/\//g; -# Get rid of everything but the actual filename - $fname=~s/^.*\/([^\/]+)$/$1/; -# Replace spaces by underscores - $fname=~s/\s+/\_/g; -# Replace all other weird characters by nothing - $fname=~s/[^\w\.\-]//g; -# See if there is anything left - unless ($fname) { return 'error: no uploaded file'; } - -# Save the file - chomp($ENV{'form.uploadname'}); - open(my $fh,'>'.$tempdir.'/'.$fname); - print $fh $ENV{'form.uploadname'}; - close($fh); - return $fname; -} sub display_one { my ($r) = @_; @@ -250,7 +233,9 @@ Please choose the CMS used to create you @@ -274,7 +259,7 @@ Please choose the CMS used to create you   - + @@ -313,18 +298,20 @@ ENDBLOCK sub display_two { - my ($r,$crs,$areasref,%cmsmap) = @_; + my ($r,$crs,$areasref,$areaname,%cmsmap) = @_; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folder','source']); - my $cms = $ENV{'form.source'}; + my $cms = $env{'form.source'}; my $timenow = time; my $tempdir = &Apache::imsprocessor::create_tempdir('DOCS',$crs,$timenow); - my $fname = &uploadzip($tempdir); + my $fname = &Apache::imsprocessor::uploadzip('DOCS',$tempdir); my $unzip_result = ''; my $manifest_result = ''; unless ($tempdir eq '') { $unzip_result = &Apache::imsprocessor::expand_zip($tempdir,$fname); } my %resources = (); + my %includedres = (); + my %includeditems = (); my %items = (); my %hrefs = (); my %resinfo = (); @@ -346,23 +333,11 @@ sub display_two { users => 0, ); - my %areaname = ( - announce => 'Announcements', - board => 'Discussion Boards', - doc => 'Documents, pages & folders', - extlink => 'Links to external sites', - pool => 'Question pools', - quiz => 'Quizzes', - staff => 'Staff information', - survey => 'Surveys', - users => 'Enrollment', - ); - if ($unzip_result eq 'ok') { - $manifest_result = &Apache::imsprocessor::process_manifest($cms,$tempdir,\%resources,\%items,\%hrefs,\%resinfo); + $manifest_result = &Apache::imsprocessor::process_manifest($cms,$tempdir,\%resources,\%items,\%hrefs,\%resinfo,'choose',\%includedres,\%includeditems); if ($manifest_result eq 'ok') { foreach my $res (sort keys %resources) { - if ($cms eq 'bb5') { + if ($cms eq 'bb5' || $cms eq 'bb6' || $cms eq 'webct4') { foreach my $area (keys %{$cmsmap{$cms}}) { if ($resources{$res}{type} eq $cmsmap{$cms}{$area}) { $count{$area} ++; @@ -425,7 +400,7 @@ ENDBLOCK $r->print(qq|onClick='javascript:setOptions("$area","$counter")'|); } $r->print("/> -   $areaname{$area}   - $count{$area} item(s)"); +   $$areaname{$area}   - $count{$area} item(s)"); if ($area eq 'board') { $r->print("    + @@ -528,14 +503,16 @@ ENDDOCUMENT sub display_three { my ($r,$crs,$cdom,$chome,$uname,$udom,$areas,%cmsmap) = @_; - my $folder = $ENV{'form.folder'}; - my $cms = $ENV{'form.source'}; - my $tempdir = $ENV{'form.tempdir'}; + my $folder = $env{'form.folder'}; + my $cms = $env{'form.source'}; + my $tempdir = $env{'form.tempdir'}; my $longcrs = ''; if ($crs =~ m/^(\d)(\d)(\d)/) { $longcrs = $1.'/'.$2.'/'.$3.'/'.$crs; } - my %imports = (); + my %importareas = (); + my %includedres = (); + my %includeditems = (); my @targets = (); my %resources = (); my %items = (); @@ -557,7 +534,6 @@ sub display_three { my $timenow = time; my $destdir = $Apache::lonnet::perlvar{'lonDocRoot'}.'/userfiles/'.$cdom.'/'.$crs.'/'.$timenow; - my $dirname = $cdom.'/'.$crs.'/'.$timenow; my $seqstem = "/uploaded/$cdom/$crs/$timenow"; my $db_handling = ''; my $user_handling = ''; @@ -565,63 +541,96 @@ sub display_three { my $toplevel = ''; my $foldername = ''; my %topitems = (); - if (defined($ENV{'form.toplevel'}) ) { - $toplevel = $ENV{'form.toplevel'}; + if (defined($env{'form.toplevel'}) ) { + $toplevel = $env{'form.toplevel'}; } - if (defined($ENV{'form.foldername'}) ) { - $foldername = $ENV{'form.foldername'}; + if (defined($env{'form.foldername'}) ) { + $foldername = $env{'form.foldername'}; } - + foreach my $area (@{$areas}) { - if (defined($ENV{"form.$area"}) ) { + if (defined($env{"form.$area"}) && ($env{'form.'.$area} ne '')) { if ($cms eq 'angel' && $area eq 'doc') { foreach (@{$cmsmap{$cms}{$area}}) { - $imports{$_} = 1; + $importareas{$_} = 1; } } else { - $imports{$cmsmap{$cms}{$area}} = 1; + $importareas{$cmsmap{$cms}{$area}} = 1; } if ($area eq 'board') { - $db_handling = $ENV{'form.db_handling'}; + $db_handling = $env{'form.db_handling'}; } elsif ($area eq 'users') { - $user_handling = $ENV{'form.user_handling'}; + $user_handling = $env{'form.user_handling'}; + } + } + } + + my $manifest_result = &Apache::imsprocessor::process_manifest($cms,$tempdir,\%resources,\%items,\%hrefs,\%resinfo,'prepare',\%includedres,\%includeditems); + if ($manifest_result eq 'ok') { + foreach my $res (sort keys %resources) { + if ($importareas{$resources{$res}{type}}) { + $includedres{$res} = 1; } } + foreach my $itm (sort keys %items) { + &Apache::imsprocessor::get_imports(\%includeditems,\%items,\%resources,\%importareas,$itm); + } + } + foreach my $itm (sort keys %includeditems) { + &Apache::imsprocessor::get_parents(\%includeditems,\%items,$itm); } - - my $manifest_result = &Apache::imsprocessor::process_manifest($cms,$tempdir,\%resources,\%items,\%hrefs,\%resinfo); + + $manifest_result = &Apache::imsprocessor::process_manifest($cms,$tempdir,\%resources,\%items,\%hrefs,\%resinfo,'build',\%includedres,\%includeditems); if ($manifest_result eq 'ok') { - &Apache::imsprocessor::target_resources(\%resources,\%imports,\@targets); - my $copy_result = &Apache::imsprocessor::copy_resources('DOCS',$cms,\%hrefs,$tempdir,\@targets,\%urls,$crs,$cdom,$chome,$destdir,$timenow); + + my @path = ($cdom,$crs,$timenow); + my $fullpath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/userfiles'; + foreach my $item (@path) { + $fullpath .= '/'.$item; + if (!-e "$fullpath") { + mkdir("$fullpath",0770); + } + } + my @namedirs = ("resfiles","sequences","pages","problems"); + foreach my $name (@namedirs) { + if (!-e "$fullpath/$name") { + mkdir("$fullpath/$name",0770); + } + } + &Apache::imsprocessor::target_resources(\%resources,\%importareas,\@targets); my @boards = (); my @announcements = (); my @quizzes = (); my @surveys = (); + my @pools = (); my @groups = (); my %messages = (); my @timestamp = (); my %boardnum = (); my @topurls = (); my @topnames = (); + my @packages = (); - &Apache::imsprocessor::process_resinfo($cms,$tempdir,$destdir,\%items,\%resources,\@boards,\@announcements,\@quizzes,\@surveys,\@groups,\%messages,\@timestamp,\%boardnum,\%resinfo,$udom,$uname,$cdom,$crs,$db_handling,$user_handling,\%total,$dirname,$seqstem,\@resrcfiles); + &Apache::imsprocessor::process_resinfo($cms,'DOCS',$tempdir,$destdir,\%items,\%resources,\@targets,\@boards,\@announcements,\@quizzes,\@surveys,\@pools,\@groups,\%messages,\@timestamp,\%boardnum,\%resinfo,$udom,$uname,$cdom,$crs,$db_handling,$user_handling,\%total,$seqstem,$seqstem,\@resrcfiles,\@packages,\%hrefs,\@pages,\@sequences); + + my $copy_result = &Apache::imsprocessor::copy_resources('DOCS',$cms,\%hrefs,$tempdir,\@targets,\%urls,$crs,$cdom,$chome,$destdir,$timenow,\%importareas); + + &Apache::imsprocessor::build_structure($cms,'DOCS',$destdir,\%items,\%resinfo,\%resources,\@targets,\%hrefs,$udom,$uname,'',$timenow,$cdom,$crs,\@timestamp,\%total,\@boards,\@announcements,\@quizzes,\@surveys,\@pools,\%boardnum,\@pages,\@sequences,\@topurls,\@topnames,\@packages,\%includeditems); - &Apache::imsprocessor::build_structure($cms,'DOCS',$destdir,\%resinfo,\%items,\%resources,\%hrefs,$udom,$uname,'',$timenow,$cdom,$crs,\@timestamp,\%total,\@boards,\@announcements,\@quizzes,\@surveys,\%boardnum,\@pages,\@sequences,\@topurls,\@topnames); - foreach my $item (@pages) { - my $path = $timenow.'/pages/'; - ©_items($item,$path,$cdom,$chome,$crs); + my $filename = $timenow.'/pages/'.$item; + my $fetchresult= &Apache::lonnet::process_coursefile('propagate',$crs,$cdom,$filename,''); } foreach my $item (@sequences) { unless ($item eq 'Top.sequence' && $toplevel eq 'oldfolder') { - my $path = $timenow.'/sequences/'; - ©_items($item,$path,$cdom,$chome,$crs); + my $filename = $timenow.'/sequences/'.$item; + my $fetchresult= &Apache::lonnet::process_coursefile('propagate',$crs,$cdom,$filename,''); } } foreach my $item (@resrcfiles) { - my $path = $timenow.'/resfiles/'; - ©_items($item,$path,$cdom,$chome,$crs); + my $filename = $timenow.'/resfiles/'.$item; + my $fetchresult= &Apache::lonnet::process_coursefile('propagate',$crs,$cdom,$filename,''); } my @imports = (); @@ -633,7 +642,7 @@ sub display_three { } } elsif ($toplevel eq 'newfolder') { my $url = &Apache::lonnet::unescape("/uploaded/$cdom/$crs/$timenow/sequences/Top.sequence"); - my $name = &Apache::lonnet::unescape("$ENV{'form.foldername'}"); + my $name = &Apache::lonnet::unescape("$env{'form.foldername'}"); push @imports, $name, $url; } my $errtext=''; @@ -643,11 +652,14 @@ sub display_three { $Apache::lonratedt::order[0]=1; $Apache::lonratedt::resources[1]=''; } - my ($errtext,$fatal)=&Apache::londocs::group_import($crs, $cdom, $folder,@imports); + my ($errtext,$fatal)=&Apache::londocs::group_import($crs,$cdom,$folder,'sequence','imsimport',@imports); if ($fatal) { print STDERR "Fatal error during group_import\n"; } } + if ($tempdir =~ m/^\/home\/httpd\/perl\/tmp\/$crs\/\d{10}/) { + system("rm -r -f $tempdir"); + } $r->print(< @@ -676,11 +688,11 @@ ENDBLOCK

Changes will become active for your current session after - + |; - $initblock .= &mt('or the next time you log in.'); + $initblock .= ', '.&mt('or the next time you log in.'); $initblock .= qq|

|; $r->print($initblock); $r->print(<