Diff for /loncom/interface/loncoursegroups.pm between versions 1.63 and 1.64

version 1.63, 2006/11/02 21:06:06 version 1.64, 2006/11/20 23:49:49
Line 92  sub handler { Line 92  sub handler {
   
     my $action = $env{'form.action'};      my $action = $env{'form.action'};
     my $state = $env{'form.state'};      my $state = $env{'form.state'};
     if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify')) {      if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify') || ($action eq 'delete')) {
         if (!defined($state)) {          if (!defined($state)) {
             $state = 'view';              $state = 'view';
         }          }
     }      }
     if ($action eq 'create' || $action eq 'modify' || $action eq 'view') {       if ($action eq 'create' || $action eq 'modify' || $action eq 'view' || 
           $action eq 'delete') { 
         if ($view_permission || $manage_permission) {          if ($view_permission || $manage_permission) {
             if ($state eq 'view') {              if ($state eq 'view') {
                 &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,                  &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,
Line 165  sub display_groups { Line 166  sub display_groups {
                          $env{'form.refpage'}.'&state=pick_task&groupname=',                           $env{'form.refpage'}.'&state=pick_task&groupname=',
       view => '<a href="/adm/'.$cdom.'/'.$cnum.'/',        view => '<a href="/adm/'.$cdom.'/'.$cnum.'/',
       delete => '<a href="/adm/coursegroups?action=delete&refpage='.        delete => '<a href="/adm/coursegroups?action=delete&refpage='.
                          $env{'form.refpage'}.'&groupname=',                           $env{'form.refpage'}.'&state=verify&groupname=',
     );      );
     my %lt = &Apache::lonlocal::texthash(       my %lt = &Apache::lonlocal::texthash( 
                           modify => 'Modify',                            modify => 'Modify',
Line 305  END Line 306  END
                         if (($manage_permission) &&                           if (($manage_permission) && 
                             ($env{'form.refpage'} ne 'enrl')) {                              ($env{'form.refpage'} ne 'enrl')) {
                             $link .= '&nbsp;&nbsp;'.$actionlinks{'modify'}.                              $link .= '&nbsp;&nbsp;'.$actionlinks{'modify'}.
                                       $group.'">'.$lt{'modify'}.'</a>';                                        $group.'">'.$lt{'modify'}.'</a>'.
                                        '&nbsp;&nbsp;'.$actionlinks{'delete'}.
                                         $group.'">'.$lt{'delete'}.'</a>';
                         }                          }
                     }                      }
                     $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').                      $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').
Line 808  function changeSort(caller) { Line 811  function changeSort(caller) {
     my %branchstates = ();      my %branchstates = ();
     @{$states{'create'}} = ('pick_name','pick_members','pick_privs','result');      @{$states{'create'}} = ('pick_name','pick_members','pick_privs','result');
     @{$states{'modify'}} = ('pick_task');      @{$states{'modify'}} = ('pick_task');
       @{$states{'delete'}} = ('verify','result');
     @{$branchstates{'noprivs'}} = ('result');      @{$branchstates{'noprivs'}} = ('result');
     @{$branchstates{'settings'}} = ('change_settings','chgresult');      @{$branchstates{'settings'}} = ('change_settings','chgresult');
     @{$branchstates{'members'}} = ('change_members','change_privs','memresult');      @{$branchstates{'members'}} = ('change_members','change_privs','memresult');
Line 818  function changeSort(caller) { Line 822  function changeSort(caller) {
         push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}});          push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}});
     }      }
   
     if (($action eq 'create') || ($action eq 'modify')) {      if (($action eq 'create') || ($action eq 'modify') || ($action eq 'delete')) {
         my $done = 0;          my $done = 0;
         my $i=0;          my $i=0;
         while ($i<@{$states{$action}} && !$done) {          while ($i<@{$states{$action}} && !$done) {
Line 839  function changeSort(caller) { Line 843  function changeSort(caller) {
         ({href=>"/adm/dropadd",          ({href=>"/adm/dropadd",
           text=>"Enrollment Manager",            text=>"Enrollment Manager",
           faq=>9,bug=>'Instructor Interface',});            faq=>9,bug=>'Instructor Interface',});
         if ($action eq 'modify') {          if ($action eq 'modify' || $action eq 'delete') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"/adm/coursegroups?refpage=enrl&action=modify",              ({href=>"/adm/coursegroups?refpage=enrl&action=$action",
               text=>"Groups",                text=>"Groups",
               faq=>9,bug=>'Instructor Interface',});                faq=>9,bug=>'Instructor Interface',});
         }          }
Line 877  function changeSort(caller) { Line 881  function changeSort(caller) {
                             memresult => 'Modifications Complete',                              memresult => 'Modifications Complete',
                             addresult => 'Additions Complete',                              addresult => 'Additions Complete',
                           );                            );
       %{$trail{'delete'}} = &Apache::lonlocal::texthash(
                               verify => 'Verify deletion',
                               result => 'Deletion Complete'
                             );
     my %navbuttons = &Apache::lonlocal::texthash(      my %navbuttons = &Apache::lonlocal::texthash(
                              gtns => 'Go to next step',                               gtns => 'Go to next step',
                              gtps => 'Go to previous step',                               gtps => 'Go to previous step',
Line 885  function changeSort(caller) { Line 893  function changeSort(caller) {
                              gtpp => 'Go to previous page',                               gtpp => 'Go to previous page',
                              adme => 'Add members',                               adme => 'Add members',
     );      );
     if ((($action eq 'create') || ($action eq 'modify')) &&      if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete')) &&
               ($manage_permission)) {                ($manage_permission)) {
         for (my $i=0; $i<@{$states{$action}}; $i++) {          for (my $i=0; $i<@{$states{$action}}; $i++) {
             if ($state eq $states{$action}[$i]) {              if ($state eq $states{$action}[$i]) {
Line 903  function changeSort(caller) { Line 911  function changeSort(caller) {
  $crstype);   $crstype);
                 last;                  last;
             } else {              } else {
                 if (($state eq 'result') && ($i > 0)) {                  if (($action eq 'create') || ($action eq 'modify')) {
                     &Apache::lonhtmlcommon::add_breadcrumb(                      if (($state eq 'result') && ($i > 0)) {
                           &Apache::lonhtmlcommon::add_breadcrumb(
     {href=>"javascript:backPage(document.$state,'$states{$action}[0]')",      {href=>"javascript:backPage(document.$state,'$states{$action}[0]')",
       text=>"$trail{$action}{$states{$action}[$i]}"});        text=>"$trail{$action}{$states{$action}[$i]}"});
                 } else {                       } else { 
                     &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
      {href=>"javascript:backPage(document.$state,'$states{$action}[$i]')",       {href=>"javascript:backPage(document.$state,'$states{$action}[$i]')",
       text=>"$trail{$action}{$states{$action}[$i]}"});        text=>"$trail{$action}{$states{$action}[$i]}"});
                       }
                 }                  }
             }              }             
         }          }
     } elsif (($action eq 'view') && ($view_permission)) {      } elsif (($action eq 'view') && ($view_permission)) {
                         &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
Line 922  function changeSort(caller) { Line 932  function changeSort(caller) {
         &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,          &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
  $manage_permission,$action,$state,$gpterm,$ucgpterm,   $manage_permission,$action,$state,$gpterm,$ucgpterm,
  $crstype);   $crstype);
   
     }      }
     $r->print(&footer());      $r->print(&footer());
     return;      return;
Line 1069  sub display_control { Line 1078  sub display_control {
                              $sections,$states,$navbuttons,$memchg,                               $sections,$states,$navbuttons,$memchg,
                              $sectioncount,$stored,$gpterm,$ucgpterm,$crstype);                               $sectioncount,$stored,$gpterm,$ucgpterm,$crstype);
         }          }
       } elsif ($action eq 'delete') {
           my %stored = &retrieve_settings($cdom,$cnum,$groupname);
           if ($state eq 'verify') {
               &verify_delete($r,$groupname,$state,$action,$page,$states,
                              \%stored);
           } elsif ($state eq 'result') {
               &delete_group($r,$cdom,$cnum,$groupname);
           }
       }
   }
   
   sub verify_delete {
       my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;
       $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
       $r->print(&mt("You have requested deletion of the following group: ").'<i>'.
                 $stored->{'description'}.'</i>'.
                 '<br /><br />'.&mt('When a group is deleted the following occurs:').'<ul>'.
                 '<li>'.&mt('All group membership is terminated.').'</li>'.
                 '<li>'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'</li>'.
                 '<li>'.&mt('The group folder is removed from the folder containing it - normally this is the "Course Groups" folder which contains folders for all groups in the course.').'</li>'.
                 '</ul>'.&mt('Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same course in the future.'));
       my $prevtext = &mt('Go back');
       my $nexttext = &mt('Delete group');
       my $prev;
       if ($env{'form.refpage'} eq 'enrl')  {
           $prev = 'view';
       }
       &display_navbuttons($r,$formname,$prev,$prevtext,
                           $$states{$action}[$page+1],$nexttext);
       return;
   }
   
   sub delete_group {
       my ($r,$cdom,$cnum,$groupname) = @_;
       my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                              $groupname);
       my $now = time;
       my $num_users = 0;
       my $num_fail = 0;
       my $num_ok = 0;
       my @deleted;
       my @undeleted;
       my %usersettings;
       foreach my $key (sort(keys(%membership))) {
           if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
               my $user = $1;
               my($end,$start,@userprivs) = split(/:/,$membership{$key});
               if ($start != -1) {
                   $num_users ++;
                   $usersettings{$groupname.':'.$user} = $now.':-1:';
                   if (&Apache::lonnet::modify_group_roles($cdom,$cnum,
                                                           $groupname,$user,
                                                           $now,'-1','')
                       eq 'ok') {
                       $num_ok ++;
                       push(@deleted,$user);
                   } else {
                       push(@undeleted,$user);
                       $num_fail ++;
                   }
               }
           }
       }
       if ($num_ok > 0) {
           my $roster_result = 
               &Apache::lonnet::modify_coursegroup_membership($cdom,$cnum,
                                                              \%usersettings);
       }
       if ($num_fail > 0) {
           $r->print(&mt('Group deletion failed because deletion of [_1] out of [_2] members failed',$num_fail,$num_users));
           
       } else {
           my ($result,$message) = 
                &Apache::lonnet::delete_coursegroup($cdom,$cnum,$groupname);
           if ($result eq 'ok') {
               my $outcome = &modify_folders($cdom,$cnum,$groupname);
               if ($outcome eq '') {
                   $r->print(&mt('Group successfully deleted'));
               } else {
                   $r->print(&mt("Although the group was deleted, an error ([_1]) occurred when removing the group's folder from the 'Course Groups' folder.",$outcome));
               }
           } else {
               $r->print(&mt('Group deletion failed'));
           }
     }      }
       return;
   }
   
   sub modify_folders {
       my ($cdom,$cnum,$groupname) = @_;
       my $outcome;
       my $navmap = Apache::lonnavmaps::navmap->new();
       my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'.
                      $groupname.'.sequence';
       my $groupmapres = $navmap->getResourceByUrl($groupmap);
       if ($groupmapres) {
           my ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb());
           $map = '/'.$map;
           my ($errtext,$fatal) = &LONCAPA::map::mapread($map);
           if ($fatal) {
               $outcome=&mt('Error reading contents of parent folder to group').
                            " ($map): $errtext".'<br />';
           } else {
               my $idx = 0;
               my $grpidx;
               foreach my $item (@LONCAPA::map::order) {
                   my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$item]);
                   $url=&LONCAPA::map::qtescape($url);
                   if ($url eq $groupmap) {
                       $grpidx = $idx;
                       last;
                   } else {
                       $idx++;
                   }
               }
   
               if ($grpidx ne '') {
                   &LONCAPA::map::makezombie($LONCAPA::map::order[$grpidx]);
                   for (my $i=$grpidx;$i<$#LONCAPA::map::order;$i++) {
                       $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
                   }
                   $#LONCAPA::map::order--;
                   my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1);
                   if ($outtext) {
                       $outcome = &mt('Error storing updated parent folder to group'). " ($map): $errtext".'<br />';
                       return;
                   }
               }
           }
       }
       undef($navmap);
       return $outcome;
 }  }
   
 sub header {  sub header {
Line 1543  sub display_navbuttons { Line 1683  sub display_navbuttons {
       <input type="button" name="previous" value = "'.$prevtext.'"        <input type="button" name="previous" value = "'.$prevtext.'"
     onclick="javascript:backPage(document.'.$formname.','."'".$prev."'".')"/>      onclick="javascript:backPage(document.'.$formname.','."'".$prev."'".')"/>
    &nbsp;&nbsp;&nbsp;');     &nbsp;&nbsp;&nbsp;');
       } elsif ($prevtext) {
           $r->print('
         <input type="button" name="previous" value = "'.$prevtext.'"
       onclick="javascript:history.back()"/>
      &nbsp;&nbsp;&nbsp;');
     }      }
     if ($next) {      if ($next) {
         $r->print('          $r->print('
Line 3458  sub map_updater { Line 3603  sub map_updater {
                                                  ':false:normal:res';                                                   ':false:normal:res';
         $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;          $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
         my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1);          my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1);
         if ($errtext) {          if ($outtext) {
             $outcome = &mt('Error storing updated parent folder')." ($parentmap):  $errtext".'<br />';              $outcome = &mt('Error storing updated parent folder')." ($parentmap):  $errtext".'<br />';
             return $outcome;              return $outcome;
         }          }
Line 3568  sub validate_groupname { Line 3713  sub validate_groupname {
     my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_;      my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_;
     my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);      my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
     my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);      my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
       my %deleted_groups = &Apache::lonnet::get_deleted_groups($cdom,$cnum);
       if (my $tmp = &Apache::lonnet::error(%deleted_groups)) {
           undef(%deleted_groups);
           &Apache::lonnet::logthis('Error retrieving groups: '.$tmp.' in '.$cnum.':'.$cdom);
       }
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                       igna => "Invalid $gpterm name",                        igna => "Invalid $gpterm name",
                       tgne => "The $gpterm name entered ",                        tgne => "The $gpterm name entered ",
Line 3595  sub validate_groupname { Line 3744  sub validate_groupname {
  return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.   return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.
     '<br />'.$lt{'grna'};      '<br />'.$lt{'grna'};
     }      }
     if ($action eq 'create'       if ($action eq 'create') { 
  && exists($curr_groups{$groupname})) {   if (exists($curr_groups{$groupname})) {
       return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).
  return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).             $lt{'inth'}.'.<br />'.$lt{'grna'};
     $lt{'inth'}.'<br />'.$lt{'grna'};          } elsif (exists($deleted_groups{$groupname})) {
               return $exitmsg.$lt{'cnnb'}.&mt('a [_1] which previously existed',$gpterm).
                      $lt{'inth'}.'.<br />'.$lt{'grna'};
           }
     } elsif ($action eq 'modify') {      } elsif ($action eq 'modify') {
         unless(exists($curr_groups{$groupname})) {          unless(exists($curr_groups{$groupname})) {
             $earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}.              $earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}.

Removed from v.1.63  
changed lines
  Added in v.1.64


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