--- loncom/interface/loncoursegroups.pm 2006/11/20 23:49:49 1.64 +++ loncom/interface/loncoursegroups.pm 2006/11/28 19:46:00 1.65 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursegroups.pm,v 1.64 2006/11/20 23:49:49 raeburn Exp $ +# $Id: loncoursegroups.pm,v 1.65 2006/11/28 19:46:00 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -92,13 +92,13 @@ sub handler { my $action = $env{'form.action'}; my $state = $env{'form.state'}; - if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify') || ($action eq 'delete')) { + if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) { if (!defined($state)) { $state = 'view'; } } if ($action eq 'create' || $action eq 'modify' || $action eq 'view' || - $action eq 'delete') { + $action eq 'delete' || $action eq 'reenable') { if ($view_permission || $manage_permission) { if ($state eq 'view') { &print_main_menu($r,$cdom,$cnum,\%functions,\%idx, @@ -167,11 +167,14 @@ sub display_groups { view => ' 'print(&mt('Group deletion failed')); + $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; @@ -1173,8 +1233,12 @@ sub modify_folders { my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'. $groupname.'.sequence'; my $groupmapres = $navmap->getResourceByUrl($groupmap); + my ($map,$id,$src); if ($groupmapres) { - my ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb()); + ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb()); + } + undef($navmap); + if ($map) { $map = '/'.$map; my ($errtext,$fatal) = &LONCAPA::map::mapread($map); if ($fatal) { @@ -1201,17 +1265,111 @@ sub modify_folders { } $#LONCAPA::map::order--; my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1); - if ($outtext) { - $outcome = &mt('Error storing updated parent folder to group'). " ($map): $errtext".'
'; - return; - } + if ($errtext) { + $outcome = &mt('Error storing updated parent folder to group'). "- $map - $errtext".'
'; + } else { + my ($furl,$ferr) = + &Apache::lonuserstate::readmap($cdom.'/'.$cnum); + } } } } - undef($navmap); 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:').''); + 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')); + } +} + sub header { my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_; my $start_page= @@ -3713,7 +3871,8 @@ 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::lonnet::get_deleted_groups($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);