'.&mt('When a group is deleted the following occurs:').'
'.
+ '
'.&mt('All group membership is terminated.').'
'.
+ '
'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'
'.
+ '
'.&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.').'
'.
+ '
'.&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},3);
+ if ($start != -1) {
+ $num_users ++;
+ $usersettings{$groupname.':'.$user} = $now.':-1:'.$userprivs;
+ if (&Apache::lonnet::modify_group_roles($cdom,$cnum,
+ $groupname,$user,
+ $now,'-1',$userprivs)
+ 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::toggle_coursegroup_status($cdom,$cnum,
+ $groupname,'delete');
+ 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 reenable_folder {
+ my ($cdom,$cnum,$groupname,$description) = @_;
+ my $outcome;
+ my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
+ my $allgrpsmap = $crspath.'group_allfolders.sequence';
+ my $foldertitle = &mt('Course Folder -').$description;
+ my $mapurl = $crspath.'group_folder_'.
+ $groupname.'.sequence';
+ my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap);
+ if ($fatal) {
+ $outcome=&mt('Error reading contents of parent folder to group').
+ " ($allgrpsmap): $errtext".' ';
+ } else {
+ my $idx=&LONCAPA::map::getresidx($mapurl);
+ $LONCAPA::map::resources[$idx] = $foldertitle.':'.$mapurl.
+ ':false:normal:res';
+ $LONCAPA::map::order[1+$#LONCAPA::map::order]=$idx;
+ my ($outtext,$errtext) = &LONCAPA::map::storemap($allgrpsmap,1);
+ if ($errtext) {
+ $outcome = &mt('Error storing updated parent folder to group').
+ "- $allgrpsmap - $errtext".' ';
+ } else {
+ my ($furl,$ferr) =
+ &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+ }
+ }
+ return $outcome;
+}
+
+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);
+ my ($map,$id,$src);
+ if ($groupmapres) {
+ ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb());
+ }
+ undef($navmap);
+ if ($map) {
+ $map = '/'.$map;
+ my ($errtext,$fatal) = &LONCAPA::map::mapread($map);
+ if ($fatal) {
+ $outcome=&mt('Error reading contents of parent folder to group').
+ " ($map): $errtext".' ';
+ } 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 ($errtext) {
+ $outcome = &mt('Error storing updated parent folder to group'). "- $map - $errtext".' ';
+ } else {
+ my ($furl,$ferr) =
+ &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+ }
+ }
+ }
+ }
+ return $outcome;
+}
+
+sub verify_reenable {
+ my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;
+ $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
+ $r->print(&mt("You have requested enabling the following previously deleted group: ").''.
+ $stored->{'description'}.''.
+ '
'.&mt('When a deleted group is re-enabled the following occurs:').'
'.
+ '
'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'
'.
+ '
'.&mt('A group folder is added to the "Course Groups" folder which contains folders for all groups in the course.').'
');
+ my $prevtext = &mt('Go back');
+ my $nexttext = &mt('Reenable group');
+ my $prev;
+ if ($env{'form.refpage'} eq 'enrl') {
+ $prev = 'view';
+ }
+ &display_navbuttons($r,$formname,$prev,$prevtext,
+ $$states{$action}[$page+1],$nexttext);
+ return;
+}
+
+sub reenable_group {
+ my ($r,$cdom,$cnum,$groupname,) = @_;
+ my %groups =
+ &Apache::longroup::coursegroups($cdom,$cnum,$groupname,
+ 'deleted_groups');
+ my %groupinfo =
+ &Apache::longroup::get_group_settings($groups{$groupname});
+ my $defstart = $groupinfo{'startdate'};
+ my $defend = $groupinfo{'enddate'};
+ my $showstart = &Apache::lonlocal::locallocaltime($defstart);
+ my $showend;
+ if ($defend == 0) {
+ $showend = &mt('No end date set');
+ } else {
+ $showend = &Apache::lonlocal::locallocaltime($defend);
+ }
+ my $description = &unescape($groupinfo{'description'});
+ my $num_users = 0;
+ my $num_ok = 0;
+ my $num_fail = 0;
+ my (%usersettings,@enabled,@unenabled);
+ my ($result,$message) =
+ &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum,$groupname,
+ 'reenable');
+ if ($result eq 'ok') {
+ my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
+ $groupname);
+ foreach my $key (sort(keys(%membership))) {
+ if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
+ my $user = $1;
+ my($end,$start,$userprivs) = split(/:/,$membership{$key},3);
+ if (($start == -1) && ($end == $groupinfo{'modified'})) {
+ $num_users ++;
+ $usersettings{$groupname.':'.$user} = $defend.':'.
+ $defstart.':'.
+ $userprivs;
+ if (&Apache::lonnet::modify_group_roles($cdom,$cnum,
+ $groupname,$user,
+ $defend,$defstart,
+ $userprivs) eq 'ok') {
+ $num_ok ++;
+ push(@enabled,$user);
+ } else {
+ push(@unenabled,$user);
+ $num_fail ++;
+ }
+ }
+ }
+ }
+ if ($num_users > 0) {
+ if ($num_ok > 0) {
+ my $roster_result =
+ &Apache::lonnet::modify_coursegroup_membership($cdom,$cnum,
+ \%usersettings);
+ if ($roster_result eq 'ok') {
+ $r->print(&mt('Membership reinstated for [_1] users, each with start and end dates for group access set to defaults: [_2] and [_3]',$num_ok,$showstart,$showend).' ');
+ }
+ } else {
+ $r->print(&mt('A problem occurred when trying to reinstate [_1] of the [_2] members of the pre-existing group.',$num_fail,$num_users).' ');
+ }
+ } else {
+ $r->print(&mt('There were no group members to reinstate, as none were removed when the group was deleted.').' ');
+ }
+ my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description);
+ if ($outcome eq '') {
+ $r->print(&mt('Group successfully re-enabled.'));
+ } else {
+ $r->print(&mt("Although the group was re-enabled, an error ([_1]) occurred when adding the group's folder to the 'Course Groups' folder.",$outcome));
+ }
+ } else {
+ $r->print(&mt('Re-enabling group failed'));
}
}
@@ -1543,6 +1841,11 @@ sub display_navbuttons {
');
+ } elsif ($prevtext) {
+ $r->print('
+
+ ');
}
if ($next) {
$r->print('
@@ -3458,7 +3761,7 @@ sub map_updater {
':false:normal:res';
$LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1);
- if ($errtext) {
+ if ($outtext) {
$outcome = &mt('Error storing updated parent folder')." ($parentmap): $errtext".' ';
return $outcome;
}
@@ -3568,7 +3871,12 @@ sub validate_groupname {
my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_;
my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
-
+ my %deleted_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef,
+ 'deleted_groups');
+ 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 (
igna => "Invalid $gpterm name",
tgne => "The $gpterm name entered ",
@@ -3595,12 +3903,14 @@ sub validate_groupname {
return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.
' '.$lt{'grna'};
}
- if ($action eq 'create'
- && exists($curr_groups{$groupname})) {
-
- return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).
- $lt{'inth'}.' '.$lt{'grna'};
-
+ if ($action eq 'create') {
+ if (exists($curr_groups{$groupname})) {
+ return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).
+ $lt{'inth'}.'. '.$lt{'grna'};
+ } elsif (exists($deleted_groups{$groupname})) {
+ return $exitmsg.$lt{'cnnb'}.&mt('a [_1] which previously existed',$gpterm).
+ $lt{'inth'}.'. '.$lt{'grna'};
+ }
} elsif ($action eq 'modify') {
unless(exists($curr_groups{$groupname})) {
$earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}.