--- loncom/imspackages/imsimportdocs.pm 2006/03/24 17:36:27 1.17 +++ loncom/imspackages/imsimportdocs.pm 2017/11/05 20:00:48 1.35 @@ -1,3 +1,7 @@ +# The LearningOnline Network with CAPA +# +# $Id: imsimportdocs.pm,v 1.35 2017/11/05 20:00:48 raeburn Exp $ +# # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). @@ -29,58 +33,48 @@ use Apache::londocs; use Apache::loncommon; use Apache::lonlocal; use Apache::imsprocessor; -use LONCAPA::Configuration; +use LONCAPA::map(); +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + use strict; sub jscript_one { - my $javascript = shift; - $$javascript = qq# -function verify() { - if ((document.forms.pickcms.uploadname.value == '') || (!document.forms.pickcms.uploadname.value)) { - alert("You must provide the name of the IMS package to be imported") - return false - } - if (document.forms.pickcms.source.selectedIndex == 0) { - alert("You must choose the Course Management System from which the IMS package was exported"); - return false - } - return true -} - -function nextPage() { - if (verify()) { - document.forms.pickcms.submit() - } -} -#; - -} - -sub jscript_two { - my $javascript = shift; - $$javascript = qq# + my %lt = &Apache::lonlocal::texthash( + se => 'Select', + to => 'Import topics only', + tp => 'Import topics + posts (with author)', + tn => 'Import topics + posts (no author)', + es => 'Enroll students only', + ea => 'Enroll all users', + nr => 'Not required', + id => 'You must select one of the additional options when importing Discussion Boards.', + ie => 'You must select one of the additional options when importing Enrollment.', + ct => 'You must check at least one Content Type.', + ); + return <<"ENDJS"; function setOptions(caller,itemnum) { var opForm = document.forms.pickoptions var menu = 1 + itemnum*2 opForm.elements[menu].length = 0 if (opForm.elements[itemnum*2].checked == true) { 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[0] = new Option("$lt{'se'}","-1",true,true) + opForm.elements[menu].options[1] = new Option("$lt{'to'}","topics",true,true) + opForm.elements[menu].options[2] = new Option("$lt{'tp'}","allpost",true,true) + opForm.elements[menu].options[3] = new Option("$lt{'tn'}","allanon",true,true) } else { if (caller == "users") { opForm.elements[menu].length = 0 - opForm.elements[menu].options[0] = new Option("Select","-1",true,true) - opForm.elements[menu].options[1] = new Option("Enroll students only","students",true,true) - opForm.elements[menu].options[2] = new Option("Enroll all users","all",true,true) + opForm.elements[menu].options[0] = new Option("$lt{'se'}","-1",true,true) + opForm.elements[menu].options[1] = new Option("$lt{'es'}","students",true,true) + opForm.elements[menu].options[2] = new Option("$lt{'ea'}","all",true,true) } } } else { - opForm.elements[menu].options[0] = new Option("Not required","0",true,true) + opForm.elements[menu].options[0] = new Option("$lt{'nr'}","0",true,true) } opForm.elements[menu].selectedIndex = 0 } @@ -93,20 +87,20 @@ function verify(caller) { totcheck ++ if (opForm.elements[2*i].name == "board") { if (opForm.elements[2*i+1].selectedIndex == 0) { - alert("You must select one of the additional options when importing Discussion Boards ") + alert("$lt{'id'}") return false } } if (opForm.elements[2*i].name == "users") { if (opForm.elements[2*i+1].selectedIndex == 0) { - alert("You must select one of the additional options when importing Enrollment") + alert("$lt{'ie'}") return false } } } } if (totcheck == 0) { - alert("You must check the Checkbox for at least one Content Type"); + alert("$lt{'ct'}"); return false } return true @@ -117,22 +111,23 @@ function nextPage(caller) { document.forms.pickoptions.submit() } } -#; + +ENDJS + } -sub jscript_three { - my $javascript = shift; - $$javascript = qq| +sub jscript_two { + return <<"ENDJS"; function init(tf) { setTimeout("self.close()",3000) tf.submit(); } - |; + +ENDJS } sub handler { my $r = shift; - my $javascript = ''; &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; @@ -150,151 +145,54 @@ sub handler { my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; - my $plainname=&Apache::lonnet::escape( + my $plainname=&escape( &Apache::loncommon::plainname($uname,$udom)); # does this user have privileges to post, etc? my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); unless ($allowed) { $r->print(&Apache::loncommon::start_page('Import IMS package',undef, - {'only_body' => 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.'). - &Apache::loncommon::end_page()); + {'only_body' => 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.') + .'

' + .&Apache::loncommon::end_page() + ); return OK; } - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['phase']); - - if ($env{'form.phase'} eq 'one') { - &jscript_one(\$javascript); + my $javascript; + if ($env{'form.phase'} eq 'one') { + $javascript = &jscript_one(); } elsif ($env{'form.phase'} eq 'two') { - &jscript_two(\$javascript); - } elsif ($env{'form.phase'} eq 'three') { - &jscript_three(\$javascript); + $javascript = &jscript_two(); } $javascript = - "\n"; - my $start_page = &Apache::loncommon::start_page('Import IMS package', - $javascript, - {'only_body' => 1,}); + "\n"; + my $headline = 'Import IMS package'; + my $start_page = &Apache::loncommon::start_page($headline, + $javascript, + {'only_body' => 1,}) + .'

'.&mt($headline).'

'; # print screen $r->print($start_page); if ($env{'form.phase'} eq 'one') { - &display_one($r); + &display_one($r,$coursenum,\@areas,\%areaname,%cmsmap); } elsif ($env{'form.phase'} eq 'two') { - &display_two($r,$coursenum,\@areas,\%areaname,%cmsmap); - } elsif ($env{'form.phase'} eq 'three') { - &display_three($r,$coursenum,$coursedom,$uname,$udom,\@areas,%cmsmap); + &display_two($r,$coursenum,$coursedom,$uname,$udom,\@areas,%cmsmap); } $r->print(&Apache::loncommon::end_page()); return OK; -} - - -sub display_one { - my ($r) = @_; - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folder']); - - $r->print(< - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  -
  -    - Specify the Course Management system used to create the package.   - -
 
  - -Please choose the CMS used to create your IMS content package.   - - -
 
 
  -    - Locate the IMS content package you wish to upload.   - -
 
  - - - -
 
 If you have selected the CMS, and located the IMS package, you should click the 'Upload IMS package' button to upload the file to the server.
 
- - - - -
- - - -
-
- - - - -ENDBLOCK } - -sub display_two { +sub display_one { my ($r,$crs,$areasref,$areaname,%cmsmap) = @_; - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folder','source']); my $cms = $env{'form.source'}; my $timenow = time; my $tempdir = &Apache::imsprocessor::create_tempdir('DOCS',$crs,$timenow); @@ -311,10 +209,7 @@ sub display_two { my %hrefs = (); my %resinfo = (); my %count = (); - my @bgcolors = ("#eeeeee","#dddddd"); - my $counter = 0; - my $iter = 0; my %count = ( announce => 0, board => 0, @@ -328,183 +223,179 @@ sub display_two { users => 0, ); - if ($unzip_result eq 'ok') { - $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' || $cms eq 'bb6' || $cms eq 'webctce4') { - foreach my $area (keys %{$cmsmap{$cms}}) { - if ($resources{$res}{type} eq $cmsmap{$cms}{$area}) { - $count{$area} ++; - } - } - } elsif ($cms eq 'angel') { - foreach my $area (keys %{$cmsmap{$cms}}) { - if ($area eq 'doc') { - if (grep/^$resources{$res}{type}$/,@{$cmsmap{$cms}{doc}}) { - $count{$area} ++; - } - } elsif ($resources{$res}{type} eq $cmsmap{$cms}{$area}) { - $count{$area} ++; - } - } + if ($unzip_result ne 'ok') { + $r->print( + &Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success( + &mt('Processing of your IMS package failed because the file you' + .' uploaded could not be unzipped.'),1) + .'
'.&mt('Error: [_1]',$unzip_result)) + ); + return(); + } + + # Get manifest file from package + $manifest_result = &Apache::imsprocessor::process_manifest( + $cms,$tempdir,\%resources,\%items,\%hrefs, + \%resinfo,'choose',\%includedres,\%includeditems); + if ($manifest_result ne 'ok') { + $r->print( + '
'.&Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success( + &mt('Unpacking of your IMS package failed because an IMS manifest file' + .' was not located in the package.'),1)) + ); + return(); + } + + # Count areas depending on cms version + foreach my $res (sort(keys(%resources))) { + if ($cms eq 'bb5' || $cms eq 'bb6' || $cms eq 'webctce4') { + foreach my $area (keys(%{$cmsmap{$cms}})) { + if ($resources{$res}{type} eq $cmsmap{$cms}{$area}) { + $count{$area} ++; } } - $r->print(< - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  -
-    - Choose which content types you wish to import -
 
  - - - - -
- - - - -
- - - - - - -ENDBLOCK - foreach my $area (@{$areasref}) { - if ($count{$area} > 0) { - my $count_tag = 'flag_'.$counter; - $r->print(" - - "); - if ($area eq 'board') { - $r->print(" "); - } elsif ($area eq 'users') { - $r->print(" "); - } else { - $r->print(" "); + } elsif ($cms eq 'angel5') { + foreach my $area (keys(%{$cmsmap{$cms}})) { + if ($area eq 'doc') { + if (grep/^$resources{$res}{type}$/,@{$cmsmap{$cms}{doc}}) { + $count{$area} ++; } - $counter ++; - $iter = $counter%2; + } elsif ($resources{$res}{type} eq $cmsmap{$cms}{$area}) { + $count{$area} ++; } } - $r->print(< -
Import?Content typeAdditional options
print(qq|onClick='javascript:setOptions("$area","$counter")'|); - } - $r->print("/>  $$areaname{$area}   - $count{$area} item(s)   - -    - - -   None
-
-
-
 

-    - Choose display options for listing of contents of top level of package. -
 
  - - - - - - - -
   
-
 
 Once you have checked the checkboxes for all areas you wish to import from the IMS package, selected options (if available), and selected a display option for the package contents you should click the 'Complete Import' button.
  - - - - -
- - - - - -
- - - -
-
-
-ENDDOCUMENT + } else { # Unknown cms format + $r->print( + '' + .&mt('Unsupported IMS format: [_1]',$cms) + .'
' + ); + # return(); + } + } + + + # Start output: Step 1 and step 2 + + $r->print( + '
' + .&Apache::lonhtmlcommon::topic_bar( + 1,&mt('Choose which content types you wish to import')) + .'

' + .&mt('Check the checkboxes for all areas you wish to import from the IMS package:') + .'

' + ); + + $r->print( + &Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.&mt('Import?').'' + .''.&mt('Content type').'' + .''.&mt('Additional options').'' + .&Apache::loncommon::end_data_table_header_row() + ); + + # Display import row for each area/content type + foreach my $area (@{$areasref}) { + unless ($count{$area} > 0) { next }; + + my $count_tag = 'flag_'.$counter; + + # Checkbox: Import? + $r->print( + &Apache::loncommon::start_data_table_row() + .'print(qq| onclick='javascript:setOptions("$area","$counter")'|); + } + + $r->print(' />'); + + # Content Type + $r->print( + '' + .$$areaname{$area}.'   - ' + .&mt('[quant,_1,item]',$count{$area}) + .'' + ); + + # Additional Options + $r->print(''); + if ($area eq 'board') { + $r->print( + '' + ); + } elsif ($area eq 'users') { + $r->print( + '' + ); } else { - $r->print("Unpacking of your IMS package failed because an IMS manifest file was not located in the package\n"); - } - } else { - $r->print("Processing of your IMS package failed because the file you uploaded could not be unzipped\n"); - } -} + $r->print( + &mt('None') + .'' + ); + } + $r->print(''); + + $r->print(&Apache::loncommon::end_data_table_row()); + $counter ++; + } + + $r->print(&Apache::loncommon::end_data_table()); + + $r->print( + &Apache::lonhtmlcommon::topic_bar( + 2,&mt('Choose display options for listing of contents of top level of package')) + .'

' + .&mt('Select a display option for the package content:') + .'

' + ); + $r->print( + '' + .' ' + .'
' + .'' + ); + + # Buttons + $r->print( + '' + .'' + .'' + .'' + ); + $r->print( + '
' + .'

' + .'' + .' ' + .'' + .'

' + ); + $r->print('
'); +} -sub display_three { +sub display_two { my ($r,$crs,$cdom,$uname,$udom,$areas,%cmsmap) = @_; 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 %importareas = (); my %includedres = (); my %includeditems = (); @@ -545,7 +436,7 @@ sub display_three { foreach my $area (@{$areas}) { if (defined($env{"form.$area"}) && ($env{'form.'.$area} ne '')) { - if ($cms eq 'angel' && $area eq 'doc') { + if ($cms eq 'angel5' && $area eq 'doc') { foreach (@{$cmsmap{$cms}{$area}}) { $importareas{$_} = 1; } @@ -562,16 +453,16 @@ sub display_three { 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) { + foreach my $res (sort(keys(%resources))) { if ($importareas{$resources{$res}{type}}) { $includedres{$res} = 1; } } - foreach my $itm (sort keys %items) { + foreach my $itm (sort(keys(%items))) { &Apache::imsprocessor::get_imports(\%includeditems,\%items,\%resources,\%importareas,$itm); } } - foreach my $itm (sort keys %includeditems) { + foreach my $itm (sort(keys(%includeditems))) { &Apache::imsprocessor::get_parents(\%includeditems,\%items,$itm); } @@ -609,7 +500,7 @@ sub display_three { &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,$destdir,$timenow,\%importareas); + my $copy_result = &Apache::imsprocessor::copy_resources('DOCS',$cms,\%hrefs,\%resources,$tempdir,\@targets,\%urls,$crs,$cdom,$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); @@ -631,71 +522,54 @@ sub display_three { my @imports = (); if ($toplevel eq 'oldfolder') { for (my $i=0; $i<@topurls; $i++) { - my $url = &Apache::lonnet::unescape($topurls[$i]); - my $name = &Apache::lonnet::unescape($topnames[$i]); - push @imports, $name, $url; + my $url = &unescape($topurls[$i]); + my $name = &unescape($topnames[$i]); + push(@imports, [$name, $url]); } } elsif ($toplevel eq 'newfolder') { - my $url = &Apache::lonnet::unescape("/uploaded/$cdom/$crs/$timenow/sequences/Top.sequence"); - my $name = &Apache::lonnet::unescape("$env{'form.foldername'}"); - push @imports, $name, $url; + my $url = &unescape("/uploaded/$cdom/$crs/$timenow/sequences/Top.sequence"); + my $name = &unescape("$env{'form.foldername'}"); + push(@imports, [$name, $url]); } my $errtext=''; my $fatal=0; ($errtext,$fatal)= &Apache::londocs::mapread($crs,$cdom,$folder.'.sequence'); - if ($#Apache::lonratedt::order<1) { - $Apache::lonratedt::order[0]=1; - $Apache::lonratedt::resources[1]=''; + if ($#LONCAPA::map::order<1) { + $LONCAPA::map::order[0]=1; + $LONCAPA::map::resources[1]=''; } my ($errtext,$fatal)=&Apache::londocs::group_import($crs,$cdom,$folder,'sequence','imsimport',@imports); if ($fatal) { - print STDERR "Fatal error during group_import\n"; + &Apache::lonnet::logthis("Fatal error during group_import."); } } if ($tempdir =~ m/^\/home\/httpd\/perl\/tmp\/$crs\/\d{10}/) { system("rm -r -f $tempdir"); } - $r->print(< - - - - - - - - - - - - - - - - - -
  -
-    - Your import is complete -
 
  -ENDBLOCK - my $initblock = qq| -
- - -

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

|; - $r->print($initblock); - $r->print(< -
-ENDBLOCKTWO + + # All done, display success message + $r->print( + '

' + .&mt('Your import is complete.') + .'

' + ); + # Re-initialize Button + my $initbutton = + ''; + $r->print( + '
' + .'' + .'' + .'' + .'

' + .&mt('Changes will become active for your current session after [_1]' + .', or the next time you log in.' + ,$initbutton) + .'

' + .'
' + ); } 1;