');
+ my %actionlinks = (
+ modify => '/adm/coursegroups?action=modify&refpage='.
+ $env{'form.refpage'}.'&state=pick_task&groupname=',
+ view => '',
+ delete => '/adm/coursegroups?action=delete&refpage='.
+ $env{'form.refpage'}.'&state=verify&groupname=',
+ reenable => '/adm/coursegroups?action=reenable&refpage='.
+ $env{'form.refpage'}.'&state=verify&groupname=',
+ );
+ my %lt = &Apache::lonlocal::texthash(
+ modify => 'Modify',
+ view => 'View',
+ delete => 'Delete',
+ reenable => 'Re-enable',
+ act => 'Action',
+ gname => 'Group Name',
+ desc => 'Group Title',
+ crea => 'Creator',
+ crtd => 'Created',
+ last => 'Last Modified',
+ func => 'Collaborative Tools',
+ quot => 'Quota (MB)',
+ memb => 'Members',
+ file => 'Files',
+ dibd => 'Discussion Boards',
+ dius => 'Disk Use (%)',
+ nogr => 'No groups exist.',
+ crng => 'Create a new group',
+ redg => 'Re-enable a deleted group',
+ alth => 'Although your current role has privileges'.
+ ' to view any existing groups in this '.
+ lc($crstype).', you do not have privileges '.
+ 'to create new groups.',
+ );
if ($view_permission) {
- my %curr_groups;
- if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) {
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ if (!defined($action)) {
+ $action = 'view';
+ }
+ my ($status,$reenable_link);
+ if ($action eq 'reenable') {
+ $status = 'deleted_groups';
+ } else {
+ if ($manage_permission) {
+ my %deleted_groups =
+ &Apache::longroup::coursegroups($cdom,$cnum,undef,'deleted_groups');
+ if (keys(%deleted_groups) > 0) {
+ $reenable_link = ' '.$lt{'redg'}.'';
+ }
+ }
+ }
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef,
+ $status);
+
+ if (%curr_groups) {
+ my $navmap=Apache::lonnavmaps::navmap->new();
+ if (!defined($navmap)) {
+ $r->print('
'.
+ &mt('An error occurred retrieving information about resources in the course.').' '.
+ &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this page.','','').
+ '
');
+ return;
+ }
+ if ($manage_permission) {
+ if ($action ne 'reenable') {
+ $r->print(' '.$lt{'crng'}.'');
+ }
+ if ($reenable_link) {
+ $r->print($reenable_link);
+ }
+ }
+ $r->print('
');
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
} else {
- $r->print('No groups exist');
+ $r->print($lt{'nogr'});
+ if ($manage_permission) {
+ $r->print('
'.$lt{'crng'}.'');
+ if ($action ne 'reenable') {
+ if ($reenable_link) {
+ $r->print($reenable_link);
+ }
+ }
+ } else {
+ $r->print('
'.$lt{'alth'});
+ }
}
} else {
my @coursegroups = split(/:/,$env{'request.course.groups'});
if (@coursegroups > 0) {
- my %curr_groups;
- if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) {
+ $r->print('
');
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
+ if (%curr_groups) {
+ my $navmap=Apache::lonnavmaps::navmap->new();
+ if (!defined($navmap)) {
+ $r->print('
'.
+ &mt('An error occurred retrieving information about resources in the course.').' '.
+ &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this page.','','').
+ '
');
+ return;
+ }
foreach my $group (@coursegroups) {
- my %group_info = &Apache::loncommon::get_group_settings(
- $curr_groups{$group});
- my $description = &Apache::lonnet::unescape(
- $group_info{description});
- my ($uname,$udom) = split(/:/,$group_info{creator});
- $r->print(''.$group,' '.$description.'
');
+ my %group_info = &Apache::longroup::get_group_settings(
+ $curr_groups{$group});
+ my $description = &unescape(
+ $group_info{description});
+ my $link =
+ &Apache::longroup::get_group_link($cdom,$cnum,$group,$navmap).
+ '&ref=grouplist';
+ $r->print(''.$group,' '.$description.'
');
}
}
} else {
- $r->print('You are not currently a member of any active groups in this course');
+ $r->print(
+ '
'
+ .&mt('You are not currently a member of any active '.$gpterm.'s'
+ .' in this '.lc($crstype).'.')
+ .'
'.&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.').'
');
+ if ($crstype eq 'Community') {
+ $r->print( '
'.&mt("The group folder is removed from the folder containing it - normally this is the 'Community Groups' folder which contains folders for all groups in the community.").'
'.
+ '
'.&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 community in the future."));
+ } else {
+ $r->print( '
'.&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 'cusr') {
+ $prev = 'view';
+ }
+ &display_navbuttons($r,$formname,$prev,$prevtext,
+ $$states{$action}[$page+1],$nexttext);
+ return;
+}
+
+sub delete_group {
+ my ($r,$cdom,$cnum,$groupname,$crstype) = @_;
+ 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;
+ my $context = 'deletegroup';
+ 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,
+ '',$context)
+ 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,$crstype);
+ if ($outcome eq '') {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Group successfully deleted.'));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ } else {
+ $r->print('
');
+ if ($crstype eq 'Community') {
+ $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Community Groups' folder: [_1]",$outcome));
+ } else {
+ $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Course Groups' folder: [_1]",$outcome));
+ }
+ $r->print('
');
+ }
+ } else {
+ my $msg = &Apache::lonhtmlcommon::confirm_success(&mt('Group deletion failed.'),1);
+ $msg = &Apache::loncommon::confirmwrapper($msg);
+ $r->print($msg);
+ }
+ }
+ return;
+}
+
+sub reenable_folder {
+ my ($cdom,$cnum,$groupname,$description,$crstype) = @_;
+ my $outcome;
+ my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
+ my $allgrpsmap = $crspath.'group_allfolders.sequence';
+ my $foldertitle;
+ if ($crstype eq 'Community') {
+ $foldertitle = &mt("Community Folder -[_1]",$description);
+ } else {
+ $foldertitle = &mt("Course Folder -[_1]",$description);
+ }
+ my $mapurl = $crspath.'group_folder_'.
+ $groupname.'.sequence';
+ my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap);
+ if ($fatal) {
+ $outcome='
'
+ .&mt('An error occurred when 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,1);
+ if ($errtext) {
+ $outcome='
'
+ .&mt('An error occurred when saving 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,$crstype) = @_;
+ my ($outcome,$groupmap,$groupmapres,$map,$id,$src);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (!defined($navmap)) {
+ $outcome = '
';
+ if ($crstype eq 'Community') {
+ $outcome .= &mt("Error reading community contents.").' '.
+ &mt("You need to re-initialize the community.");
+ } else {
+ $outcome .= &mt("Error reading course contents.").' '.
+ &mt("You need to re-initialize the course.");
+ }
+ $outcome .= '
'
+ .&mt('An error occurred when 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,1);
+ if ($errtext) {
+ $outcome='
'
+ .&mt('An error occurred when saving 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,$crstype) = @_;
+ $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
+ $r->print(&mt('You have requested enabling the previously deleted group [_1].'
+ ,''.$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.').'
');
+ if ($crstype eq 'Community') {
+ $r->print(&mt("A group folder is added to the 'Community Groups' folder which contains folders for all groups in the community."));
+ } else {
+ $r->print(&mt("A group folder is added to the 'Course Groups' folder which contains folders for all groups in the course."));
+ }
+ $r->print('
');
+ my $prevtext = &mt('Go back');
+ my $nexttext = &mt('Reenable group');
+ my $prev;
+ if ($env{'form.refpage'} eq 'cusr') {
+ $prev = 'view';
+ }
+ &display_navbuttons($r,$formname,$prev,$prevtext,
+ $$states{$action}[$page+1],$nexttext);
+ return;
+}
+
+sub reenable_group {
+ my ($r,$cdom,$cnum,$groupname,$crstype) = @_;
+ my %groups =
+ &Apache::longroup::coursegroups($cdom,$cnum,$groupname,
+ 'deleted_groups');
+ if (keys(%groups) == 0) {
+ $r->print(&mt('The group [_1] was not re-enabled, because it is not a deleted group.[_2]Perhaps it has already been re-enabled?',''.$groupname.''),' ');
+ return;
+ }
+ 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 $context = 'reenablegroup';
+ 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,'',
+$context) 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 [quant,_1,user], 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.')
+ .'
');
+ if ($crstype eq 'Community') {
+ $r->print(&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Community Groups' folder: [_1]",$outcome));
+ } else {
+ $r->print(&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Course Groups' folder: [_1]",$outcome));
+ }
+ $r->print('
');
+ }
+ } else {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Re-enabling group failed.'),1);
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ }
+ return;
+}
+
sub header {
- my ($bodytitle,$title,$jscript,$action,$state,$function,$loaditems) = @_;
- my $html=&Apache::lonxml::xmlbegin();
- my $bodytag=&Apache::loncommon::bodytag($bodytitle,$function,$loaditems);
+ my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_;
+ my $start_page=
+ &Apache::loncommon::start_page($bodytitle,
+ '',
+ {'add_entries' => $loaditems,});
my $output = <<"END";
-$html
-
-$title
-
-
-$bodytag
-
-