Diff for /loncom/interface/londocs.pm between versions 1.532 and 1.533

version 1.532, 2013/01/14 20:32:04 version 1.533, 2013/03/11 01:46:47
Line 335  sub group_import { Line 335  sub group_import {
                           removefrommap => \%removefrommap,                            removefrommap => \%removefrommap,
                           removeparam   => \%removeparam,                            removeparam   => \%removeparam,
                       );                        );
         &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated);          my ($result,$msgsarray,$lockerror) = 
               &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated);
         if (keys(%import_errors) > 0) {          if (keys(%import_errors) > 0) {
             $fixuperrors =              $fixuperrors =
                 '<p span class="LC_warning">'."\n".                  '<p span class="LC_warning">'."\n".
Line 346  sub group_import { Line 347  sub group_import {
             }              }
             $fixuperrors .= '</ul></p>'."\n";              $fixuperrors .= '</ul></p>'."\n";
         }          }
           if (ref($msgsarray) eq 'ARRAY') {
               if (@{$msgsarray} > 0) {
                   $fixuperrors .= '<p class="LC_info">'.
                                   join('<br />',@{$msgsarray}).
                                   '</p>';
               }
           }
           if ($lockerror) {
               $fixuperrors .= '<p class="LC_error">'.
                               $lockerror.
                               '</p>';
           }
     }      }
     my ($errtext,$fatal) =      my ($errtext,$fatal) =
         &storemap($coursenum, $coursedom, $folder.'.'.$container,1);          &storemap($coursenum, $coursedom, $folder.'.'.$container,1);
Line 735  sub print_paste_buffer { Line 748  sub print_paste_buffer {
         $buffer = $type.': '.          $buffer = $type.': '.
                   &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.                    &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.
                   &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')';                    &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')';
     }  else {      } else {
         my $icon = &Apache::loncommon::icon($extension);          my $icon = &Apache::loncommon::icon($extension);
         if ($extension eq 'sequence' &&          if ($extension eq 'sequence' &&
             $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {              $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
Line 747  sub print_paste_buffer { Line 760  sub print_paste_buffer {
     }      }
     if ($canpaste) {      if ($canpaste) {
         $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);          $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);
         if (($is_uploaded_map) && (!$areachange)) {          if ((!$areachange) && (!$othercourse) &&
             if ((!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) {              ($env{'docs.markedcopy_cmd'} eq 'cut')) {
               if (($is_uploaded_map) || 
                   ($env{'docs.markedcopy_url'} =~ /(bulletinboard|smppg)$/) ||
                   ($env{'docs.markedcopy_url'} =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) {
                   my ($copytext,$movetext);
                   if ($is_uploaded_map) {
                       $copytext = &mt('Copy to new folder');
                       $movetext = &mt('Move old folder');
                   } elsif ($env{'docs.markedcopy_url'} =~ /bulletinboard$/) {
                       $copytext = &mt('Copy to new bulletin board (not posts)');
                       $movetext = &mt('Move old bulletin board (not posts)');
                   } elsif ($env{'docs.markedcopy_url'} =~ /smppg$/) {
                       $copytext = &mt('Copy to new simple page');
                       $movetext = &mt('Move old simple page');
                   } else {
                       $copytext = &mt('Copy to new uploaded document');
                       $movetext = &mt('Move old uploaded document');
                   }
                 $r->print(('&nbsp;'x 4).'<span id="pasteoptionstext">'.                  $r->print(('&nbsp;'x 4).'<span id="pasteoptionstext">'.
                           '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.                            '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.
                           &mt('Show Paste Options').'</a></span><br />'.                            &mt('Show Paste Options').'</a></span><br />'.
                           '<div id="pasteoptions" class="LC_dccid">'.('&nbsp;'x 4).                            '<div id="pasteoptions" class="LC_dccid">'.('&nbsp;'x 4).
                           '<label>'.                            '<label>'.
                           '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.                            '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.
                           &mt('Copy to new folder').'</label>'.('&nbsp;' x2).                            $copytext.'</label>'.('&nbsp;' x2).
                           '<label>'.                               '<label>'.   
                           '<input type="radio" name="docs.markedcopy_options" value="move" />'.                            '<input type="radio" name="docs.markedcopy_options" value="move" />'.
                           &mt('Move old folder').'</label><br />');                            $movetext.'</label><br />');
                 if ($env{'docs.markedcopy_nested'}) {                  if (($is_uploaded_map) && ($env{'docs.markedcopy_nested'})) {
                     $r->print('<br />'.&mt('Folder to paste contains sub-folders').                      $r->print('<br />'.&mt('Folder to paste contains sub-folders').
                               '<br /><table border="0">');                                '<br /><table border="0">');
                     my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});                      my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});
Line 965  sub do_paste_from_buffer { Line 995  sub do_paste_from_buffer {
             }              }
             if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||              if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||
                 (($newurl ne '') && ($newurl ne $url))) {                  (($newurl ne '') && ($newurl ne $url))) {
                 unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,                  unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,
                                           $allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,                                            $coursenum,$srcdom,$srcnum,$allmaps,
                                             \%rewrites,\%retitles,\%copies,\%dbcopies,
                                           \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove,                                            \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove,
                                           \%newsubdir,\%newurls)) {                                            \%newsubdir,\%newurls)) {
                     $mapmoves{$url} = 1;                      $mapmoves{$url} = 1;
                 }                  }
                 $url = $newurl;                  $url = $newurl;
             } elsif ($env{'docs.markedcopy_nested'}) {              } elsif ($env{'docs.markedcopy_nested'}) {
                 &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,$allmaps,\%rewrites,                  &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,
                                     $srcdom,$srcnum,$allmaps,\%rewrites,
                                   \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves,                                    \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves,
                                   \%mapchanges,\%tomove,\%newsubdir,\%newurls);                                     \%mapchanges,\%tomove,\%newsubdir,\%newurls); 
             }              }
Line 988  sub do_paste_from_buffer { Line 1020  sub do_paste_from_buffer {
             }              }
         }          }
     }      }
     if ($url=~ m{/smppg$}) {      my $lockerrors;
  my $db_name = &Apache::lonsimplepage::get_db_name($url);      if ($url=~ m{/(bulletinboard|smppg)$}) {
  if ($db_name =~ /^smppage_/) {          my $prefix = $1;
     #simple pages, need to copy the db contents to a new one.          #need to copy the db contents to a new one, unless this is a move.
     my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);          my %info = (
     my $now = time();                       src  => $url,
     $db_name =~ s{_\d*$ }{_$now}x;                       cdom => $coursedom,
     my $dbresult=&Apache::lonnet::put($db_name,\%contents,                       cnum => $coursenum,
     $coursedom,$coursenum);          );
             if ($dbresult eq 'ok') {          my (%lockerr,$msg);
                 $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;          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;                  $title=&mt('Copy of').' '.$title;
             } else {              } else {
                 return (&mt('Paste failed: An error occurred when copying the simple page.'));                  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};  
             }              }
  }          }
     }      }
     $title = &LONCAPA::map::qtunescape($title);      $title = &LONCAPA::map::qtunescape($title);
     my $ext='false';      my $ext='false';
Line 1030  sub do_paste_from_buffer { Line 1074  sub do_paste_from_buffer {
                 if ($newdocsdir eq '') {                  if ($newdocsdir eq '') {
                     $newdocsdir = 'default';                      $newdocsdir = 'default';
                 }                  }
                 if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {                  if (($prefixchg) || 
                       ($srcdom ne $coursedom) || ($srcnum ne $coursenum) ||
                       ($env{'form.docs.markedcopy_options'} ne 'move')) {
                     my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";                      my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";
                     $url =                      $url =
                         &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,                          &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
Line 1067  sub do_paste_from_buffer { Line 1113  sub do_paste_from_buffer {
                    docmoves => \%docmoves,                     docmoves => \%docmoves,
                    mapmoves => \%mapmoves,                     mapmoves => \%mapmoves,
                 );                  );
     $result =      ($result,my $msgsarray,my $lockerror) =
         &apply_fixups($folder,$is_map,$coursedom,$coursenum,$errors,          &apply_fixups($folder,$is_map,$coursedom,$coursenum,$errors,
                       \%updated,\%info,\%moves,$prefixchg,$oldurl,$url,'paste');                        \%updated,\%info,\%moves,$prefixchg,$oldurl,$url,'paste');
       $lockerrors .= $lockerror;
     if ($result eq 'ok') {      if ($result eq 'ok') {
         if ($is_map) {           if ($is_map) { 
             my ($errtext,$fatal) = &mapread($coursenum,$coursedom,              my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                                             $folder.'.'.$container);                                              $folder.'.'.$container);
             return $errtext if ($fatal);              return ($errtext,$save_err,$msgsarray,$lockerrors) if ($fatal);
   
             if ($#LONCAPA::map::order<1) {              if ($#LONCAPA::map::order<1) {
                 my $idx=&LONCAPA::map::getresidx();                  my $idx=&LONCAPA::map::getresidx();
Line 1105  sub do_paste_from_buffer { Line 1152  sub do_paste_from_buffer {
             $save_err = $errtext;              $save_err = $errtext;
         }          }
     }      }
      
     if ($env{'form.docs.markedcopy_options'} eq 'move') {      if ($env{'form.docs.markedcopy_options'} eq 'move') {
         &Apache::lonnet::delenv('docs.markedcopy');          &Apache::lonnet::delenv('docs.markedcopy');
         &Apache::lonnet::delenv('docs.markedcopy_nested');          &Apache::lonnet::delenv('docs.markedcopy_nested');
         &Apache::lonnet::delenv('docs.markedcopy_nestednames');          &Apache::lonnet::delenv('docs.markedcopy_nestednames');
     }      }
     return ($result,$save_err);      return ($result,$save_err,$msgsarray,$lockerrors);
 }  }
   
 sub get_newmap_url {  sub get_newmap_url {
Line 1175  sub get_newmap_url { Line 1222  sub get_newmap_url {
 }  }
   
 sub dbcopy {  sub dbcopy {
     my ($url,$coursedom,$coursenum) = @_;      my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;
     if ($url=~ m{/smppg$}) {      my ($url,$result,$errtext);
         my $db_name = &Apache::lonsimplepage::get_db_name($url);      my $url = $dbref->{'src'};
         if ($db_name =~ /^smppage_/) {      if (ref($dbref) eq 'HASH') {
             #simple pages, need to copy the db contents to a new one.          if ($url =~ m{/(smppg|bulletinboard)$}) {
             my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);              my $prefix = $1;
             my $now = time();              if (($dbref->{'cdom'} =~ /^$match_domain$/) && 
             $db_name =~ s{_\d*$ }{_$now}x;                  ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
             my $result=&Apache::lonnet::put($db_name,\%contents,                  my $db_name;
                                             $coursedom,$coursenum);                  my $marker = (split(m{/},$url))[4];
             $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;                  $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 .= '<br />'.$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} = 
                           '<div class="LC_error">'.
                           &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.').'</div>';
                   }
               }
           } elsif ($url =~ m{/syllabus$}) {
               if (($dbref->{'cdom'} =~ /^$match_domain$/) &&
                   ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
                   if (($dbref->{'cdom'} ne $coursedom) ||
                       ($dbref->{'cnum'} ne $coursenum)) {
                       my %contents=&Apache::lonnet::dump('syllabus',
                                                          $dbref->{'cdom'},
                                                          $dbref->{'cnum'});
                       $result=&Apache::lonnet::put('syllabus',\%contents,
                                                    $coursedom,$coursenum);
                   }
               }
         }          }
     }      }
     return $url;      return ($url,$result,$errtext);
 }  }
   
 sub uniqueness_check {  sub uniqueness_check {
Line 1254  sub contained_map_check { Line 1377  sub contained_map_check {
 }  }
   
 sub url_paste_fixups {  sub url_paste_fixups {
     my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies,      my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$fromcdom,$fromcnum,$allmaps,
         $dbcopies,$zombies,$params,$mapmoves,$mapchanges,$tomove,$newsubdir,$newurls) = @_;          $rewrites,$retitles,$copies,$dbcopies,$zombies,$params,$mapmoves,
           $mapchanges,$tomove,$newsubdir,$newurls) = @_;
     my $checktitle;      my $checktitle;
     if (($prefixchg) &&      if (($prefixchg) &&
         ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) {          ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) {
Line 1300  sub url_paste_fixups { Line 1424  sub url_paste_fixups {
                     my $prefix = $1;                      my $prefix = $1;
                     $mapname = $prefix.$2;                      $mapname = $prefix.$2;
                     if ($tomove->{$mapname}) {                      if ($tomove->{$mapname}) {
                         &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,                          &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,
                                           $rewrites,$retitles,$copies,$dbcopies,$zombies,                                            $srcdom,$srcnum,$allmaps,$rewrites,
                                           $params,$mapmoves,$mapchanges,$tomove,$newsubdir,                                            $retitles,$copies,$dbcopies,$zombies,
                                           $newurls);                                            $params,$mapmoves,$mapchanges,$tomove,
                                             $newsubdir,$newurls);
                         next;                          next;
                     } else {                      } else {
                         ($newurl,my $error) =                          ($newurl,my $error) =
Line 1323  sub url_paste_fixups { Line 1448  sub url_paste_fixups {
                     if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {                      if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {
                         $rewrites->{$oldurl}{$id} = $ressrc;                          $rewrites->{$oldurl}{$id} = $ressrc;
                         $mapchanges->{$ressrc} = 1;                          $mapchanges->{$ressrc} = 1;
                         unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,                          unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,
                                                   $rewrites,$retitles,$copies,$dbcopies,$zombies,                                                    $cnum,$srcdom,$srcnum,$allmaps,
                                                   $params,$mapmoves,$mapchanges,$tomove,$newsubdir,                                                    $rewrites,$retitles,$copies,$dbcopies,
                                                   $newurls)) {                                                    $zombies,$params,$mapmoves,$mapchanges,
                                                     $tomove,$newsubdir,$newurls)) {
                             $mapmoves->{$ressrc} = 1;                              $mapmoves->{$ressrc} = 1;
                         }                          }
                         $changed = 1;                          $changed = 1;
Line 1336  sub url_paste_fixups { Line 1462  sub url_paste_fixups {
                         $changed = 1;                          $changed = 1;
                     }                      }
                 }                  }
             } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/.+$}) {
                 next if ($skip);                    next if ($skip);
                 my $srcdom = $1;                  my $srcdom = $1;
                 my $srcnum = $2;                  my $srcnum = $2;
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {                  if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                     $rewrites->{$oldurl}{$id} = $ressrc;                      $rewrites->{$oldurl}{$id} = $ressrc;
                     $dbcopies->{$oldurl}{$ressrc} = $id;                      $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                       $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;
                       $changed = 1;
                   }
               } elsif ($ressrc =~ m{^/adm/$match_domain/$match_username/\d+/(smppg|bulletinboard)$}) {
                   if (($fromcdom ne $cdom) || ($fromcnum ne $cnum) ||
                       ($env{'form.docs.markedcopy_options'} ne 'move')) {
                       $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                       $dbcopies->{$oldurl}{$id}{'cdom'} = $fromcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $fromcnum;
                     $changed = 1;                      $changed = 1;
                 }                  }
             } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {
Line 1350  sub url_paste_fixups { Line 1486  sub url_paste_fixups {
                 my $srcdom = $1;                  my $srcdom = $1;
                 my $srcnum = $2;                  my $srcnum = $2;
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {                  if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                     $rewrites->{$oldurl}{$id} = $ressrc;                      $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                     $dbcopies->{$oldurl}{$ressrc} = $id;                      $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;
                     $changed = 1;                      $changed = 1;
                 }                  }
             }              }
Line 1374  sub apply_fixups { Line 1511  sub apply_fixups {
     my ($folder,$is_map,$cdom,$cnum,$errors,$updated,$info,$moves,$prefixchg,      my ($folder,$is_map,$cdom,$cnum,$errors,$updated,$info,$moves,$prefixchg,
         $oldurl,$url,$caller) = @_;          $oldurl,$url,$caller) = @_;
     my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,      my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,
         %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves);          %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,
           %lockerrors,$lockmsg);
     if (ref($updated) eq 'HASH') {      if (ref($updated) eq 'HASH') {
         if (ref($updated->{'rewrites'}) eq 'HASH') {          if (ref($updated->{'rewrites'}) eq 'HASH') {
             %rewrites = %{$updated->{'rewrites'}};              %rewrites = %{$updated->{'rewrites'}};
Line 1531  sub apply_fixups { Line 1669  sub apply_fixups {
                 %zombie = %{$zombies{$key}};                  %zombie = %{$zombies{$key}};
             }              }
             if (ref($dbcopies{$key}) eq 'HASH') {              if (ref($dbcopies{$key}) eq 'HASH') {
                 foreach my $item (keys(%{$dbcopies{$key}})) {                  foreach my $idx (keys(%{$dbcopies{$key}})) {
                     $newdb{$item} = &dbcopy($item);                      if (ref($dbcopies{$key}{$idx}) eq 'HASH') {
                           my ($newurl,$result,$errtext) =
                               &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors);
                           if ($result eq 'ok') {
                               $newdb{$idx} = $newurl;
                           } elsif (ref($errors) eq 'HASH') {
                               $errors->{$key} = 1;
                           }
                           push(@msgs,$errtext);
                       }
                 }                  }
             }              }
             if (ref($params{$key}) eq 'HASH') {              if (ref($params{$key}) eq 'HASH') {
Line 1540  sub apply_fixups { Line 1687  sub apply_fixups {
             }              }
             my ($errtext,$fatal) = &LONCAPA::map::mapread($key);              my ($errtext,$fatal) = &LONCAPA::map::mapread($key);
             if ($fatal) {              if ($fatal) {
                 return $errtext;                  return ($errtext);
             }              }
             for (my $i=0; $i<@LONCAPA::map::zombies; $i++) {              for (my $i=0; $i<@LONCAPA::map::zombies; $i++) {
                 if (defined($LONCAPA::map::zombies[$i])) {                  if (defined($LONCAPA::map::zombies[$i])) {
Line 1589  sub apply_fixups { Line 1736  sub apply_fixups {
                             }                              }
                         }                          }
                         $changed = 1;                          $changed = 1;
                     } elsif ($newdb{$src} ne '') {                      } elsif ($newdb{$idx} ne '') {
                         $src = $newdb{$src};                          $src = $newdb{$idx};
                         $changed = 1;                          $changed = 1;
                     }                      }
                     if ($changed) {                      if ($changed) {
Line 1605  sub apply_fixups { Line 1752  sub apply_fixups {
                     }                      }
                 }                  }
             }              }
               if (values(%lockerrors) > 0) {
                   $lockmsg = join('<br />',values(%lockerrors));
               }
             my $storefn;              my $storefn;
             if ($key eq $oldurl) {              if ($key eq $oldurl) {
                 $storefn = $url;                  $storefn = $url;
Line 1627  sub apply_fixups { Line 1777  sub apply_fixups {
                 &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);                  &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);
             if ($errtext) {              if ($errtext) {
                 if ($caller eq 'paste') {                  if ($caller eq 'paste') {
                     return &mt('Paste failed: an error occurred saving the folder or page.');                      return (&mt('Paste failed: an error occurred saving the folder or page.'));
                 }                  }
             }              }
         }          }
     }      }
     return 'ok';      return ('ok',\@msgs,$lockmsg);
 }  }
   
 sub copy_dependencies {  sub copy_dependencies {
Line 1820  sub editor { Line 1970  sub editor {
   
  if ($env{'form.pastemarked'}) {   if ($env{'form.pastemarked'}) {
             my %paste_errors;              my %paste_errors;
             my ($paste_res,$save_error) =              my ($paste_res,$save_error,$pastemsgarray,$lockerror) =
                 &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,                  &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,
                                       \%paste_errors);                                        \%paste_errors);
                   if (ref($pastemsgarray) eq 'ARRAY') {
                       if (@{$pastemsgarray} > 0) {
                             
                           $r->print('<p class="LC_info">'.
                                     join('<br />',@{$pastemsgarray}).
                                     '</p>');
                       }
                   }
                   if ($lockerror) {
                       $r->print('<p class="LC_error">'.
                                 $lockerror.
                                 '</p>');
                   }
                 if ($save_error ne '') {                  if ($save_error ne '') {
                     return $save_error;                       return $save_error; 
                 }                  }
Line 1856  sub editor { Line 2019  sub editor {
     foreach my $item (split(/\&/,$env{'form.importdetail'})) {      foreach my $item (split(/\&/,$env{'form.importdetail'})) {
  if (defined($item)) {   if (defined($item)) {
     my ($name,$url,$residx)=      my ($name,$url,$residx)=
  map {&unescape($_)} split(/\=/,$item);   map { &unescape($_); } split(/\=/,$item);
                     if ($url=~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) {                      if ($url =~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) {
                         my ($suffix,$errortxt,$locknotfreed) =                           my ($suffix,$errortxt,$locknotfreed) =
                             &newmap_suffix($1,$2,$coursedom,$coursenum);                              &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2);
                         if ($locknotfreed) {                          if ($locknotfreed) {
                             $r->print($locknotfreed);                              $r->print($locknotfreed);
                         }                          }
Line 1868  sub editor { Line 2031  sub editor {
                         } else {                          } else {
                             return $errortxt;                              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;
                           }
                     }                      }
     push(@imports, [$name, $url, $residx]);      push(@imports, [$name, $url, $residx]);
  }   }
Line 2598  ENDPARMS Line 2773  ENDPARMS
     return $line;      return $line;
 }  }
   
 sub newmap_suffix {  sub new_timebased_suffix {
     my ($area,$container,$coursedom,$coursenum) = @_;      my ($coursedom,$coursenum,$type,$area,$container) = @_;
     my ($prefix,$idtype,$errtext,$locknotfreed);      my ($prefix,$namespace,$idtype,$errtext,$locknotfreed);
     $prefix = 'docs';      if ($type eq 'map') {
     if ($area eq 'supplemental') {          $prefix = 'docs';
         $prefix = 'supp';          if ($area eq 'supplemental') {
               $prefix = 'supp';
           }
           $prefix .= $container;
           $namespace = 'uploadedmaps';
       } else {
           $prefix = $type;
           $namespace = 'templated';
     }      }
     $prefix .= $container;  
     $idtype = 'concat';      $idtype = 'concat';
     my ($suffix,$freedlock,$error) =      my ($suffix,$freedlock,$error) =
         &Apache::lonnet::get_timebased_id($prefix,'num','uploadedmaps',          &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,
                                           $coursedom,$coursenum);                                            $coursedom,$coursenum);
     if (!$suffix) {      if (!$suffix) {
         $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');          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) {          if ($error) {
             $errtext .= '<br />'.$error;              $errtext .= '<br />'.$error;
         }          }
     }      }
     if ($freedlock ne 'ok') {      if ($freedlock ne 'ok') {
         $locknotfreed = '<div class="LC_error">'.&mt('There was a problem removing a lockfile. This will prevent creation of additional folders or composite pages in this course.  Please contact the domain coordinator for your LON-CAPA domain.').'</div>';          $locknotfreed = 
               '<div class="LC_error">'.
               &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.').
               '</div>';
     }      }
     return ($suffix,$errtext,$locknotfreed);      return ($suffix,$errtext,$locknotfreed);
 }  }
Line 4377  sub generate_edit_table { Line 4578  sub generate_edit_table {
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname,$supplementalflag) = @_;      my ($udom,$uname,$supplementalflag) = @_;
     my $now = time();  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           p_mnf => 'Name of New Folder',                                            p_mnf => 'Name of New Folder',
                                           t_mnf => 'New Folder',                                            t_mnf => 'New Folder',
Line 4475  function makesmppage() { Line 4675  function makesmppage() {
    var title=prompt('$lt{"p_msp"}');     var title=prompt('$lt{"p_msp"}');
    if (title) {     if (title) {
     this.document.forms.newsmppg.importdetail.value=      this.document.forms.newsmppg.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/$now/smppg';   escape(title)+'=/adm/$udom/$uname/new/smppg';
     this.document.forms.newsmppg.submit();      this.document.forms.newsmppg.submit();
    }     }
 }  }
Line 4502  function makebulboard() { Line 4702  function makebulboard() {
    var title=prompt('$lt{"p_mbb"}');     var title=prompt('$lt{"p_mbb"}');
    if (title) {     if (title) {
     this.document.forms.newbul.importdetail.value=      this.document.forms.newbul.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';   escape(title)+'=/adm/$udom/$uname/new/bulletinboard';
     this.document.forms.newbul.submit();      this.document.forms.newbul.submit();
    }     }
 }  }

Removed from v.1.532  
changed lines
  Added in v.1.533


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>