version 1.64, 2006/11/20 23:49:49
|
version 1.65, 2006/11/28 19:46:00
|
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') || ($action eq 'delete')) { |
if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) { |
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') { |
$action eq 'delete' || $action eq 'reenable') { |
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 167 sub display_groups {
|
Line 167 sub display_groups {
|
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'}.'&state=verify&groupname=', |
$env{'form.refpage'}.'&state=verify&groupname=', |
|
reenable => '<a href="/adm/coursegroups?action=reenable&refpage='. |
|
$env{'form.refpage'}.'&state=verify&groupname=', |
); |
); |
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
modify => 'Modify', |
modify => 'Modify', |
view => 'View', |
view => 'View', |
delete => 'Delete', |
delete => 'Delete', |
|
reenable => 'Re-enable', |
act => 'Action', |
act => 'Action', |
gname => 'Group Name', |
gname => 'Group Name', |
desc => 'Group Title', |
desc => 'Group Title', |
Line 195 sub display_groups {
|
Line 198 sub display_groups {
|
if (!defined($action)) { |
if (!defined($action)) { |
$action = 'view'; |
$action = 'view'; |
} |
} |
my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum); |
my $status; |
|
if ($action eq 'reenable') { |
|
$status = 'deleted_groups'; |
|
} |
|
my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef, |
|
$status); |
if (%curr_groups) { |
if (%curr_groups) { |
if ($manage_permission) { |
if ($manage_permission) { |
if (!exists($env{'form.refpage'})) { |
if (!exists($env{'form.refpage'})) { |
Line 293 END
|
Line 301 END
|
$functionality = &mt('None available'); |
$functionality = &mt('None available'); |
} |
} |
my $link = $actionlinks{$action}; |
my $link = $actionlinks{$action}; |
if ($action eq 'modify' || $action eq 'delete') { |
if ($action eq 'modify' || $action eq 'delete' || |
|
$action eq 'reenable') { |
$link .= $group; |
$link .= $group; |
} else { |
} else { |
$link .= $group.'/smppg?ref=grouplist'; |
$link .= $group.'/smppg?ref=grouplist'; |
Line 433 sub group_administration {
|
Line 442 sub group_administration {
|
$state = 'pick_task'; |
$state = 'pick_task'; |
} |
} |
} else { |
} else { |
%stored = &retrieve_settings($cdom,$cnum,$groupname); |
%stored = &retrieve_settings($cdom,$cnum,$groupname,$action); |
if (ref($stored{'types'}) eq 'ARRAY') { |
if (ref($stored{'types'}) eq 'ARRAY') { |
@types = @{$stored{'types'}}; |
@types = @{$stored{'types'}}; |
} |
} |
Line 812 function changeSort(caller) {
|
Line 821 function changeSort(caller) {
|
@{$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'); |
@{$states{'delete'}} = ('verify','result'); |
|
@{$states{'reenable'}} = ('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 822 function changeSort(caller) {
|
Line 832 function changeSort(caller) {
|
push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}}); |
push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}}); |
} |
} |
|
|
if (($action eq 'create') || ($action eq 'modify') || ($action eq 'delete')) { |
if (($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) { |
my $done = 0; |
my $done = 0; |
my $i=0; |
my $i=0; |
while ($i<@{$states{$action}} && !$done) { |
while ($i<@{$states{$action}} && !$done) { |
Line 885 function changeSort(caller) {
|
Line 895 function changeSort(caller) {
|
verify => 'Verify deletion', |
verify => 'Verify deletion', |
result => 'Deletion Complete' |
result => 'Deletion Complete' |
); |
); |
|
%{$trail{'reenable'}} = &Apache::lonlocal::texthash( |
|
verify => 'Verify Re-enable', |
|
result => 'Re-enabled' |
|
); |
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 893 function changeSort(caller) {
|
Line 907 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') || ($action eq 'delete')) && |
if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) && |
($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 938 function changeSort(caller) {
|
Line 952 function changeSort(caller) {
|
} |
} |
|
|
sub retrieve_settings { |
sub retrieve_settings { |
my ($cdom,$cnum,$groupname) = @_; |
my ($cdom,$cnum,$groupname,$action) = @_; |
my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname); |
my %curr_groups; |
|
my $namespace; |
|
if ($action eq 'reenable') { |
|
$namespace = 'deleted_groups'; |
|
} else { |
|
$namespace = 'coursegroups'; |
|
} |
|
%curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname, |
|
$namespace); |
|
|
return if (!%curr_groups); |
return if (!%curr_groups); |
|
|
Line 1079 sub display_control {
|
Line 1101 sub display_control {
|
$sectioncount,$stored,$gpterm,$ucgpterm,$crstype); |
$sectioncount,$stored,$gpterm,$ucgpterm,$crstype); |
} |
} |
} elsif ($action eq 'delete') { |
} elsif ($action eq 'delete') { |
my %stored = &retrieve_settings($cdom,$cnum,$groupname); |
my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action); |
if ($state eq 'verify') { |
if ($state eq 'verify') { |
&verify_delete($r,$groupname,$state,$action,$page,$states, |
&verify_delete($r,$groupname,$state,$action,$page,$states, |
\%stored); |
\%stored); |
} elsif ($state eq 'result') { |
} elsif ($state eq 'result') { |
&delete_group($r,$cdom,$cnum,$groupname); |
&delete_group($r,$cdom,$cnum,$groupname); |
} |
} |
|
} elsif ($action eq 'reenable') { |
|
my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action); |
|
if ($state eq 'verify') { |
|
&verify_reenable($r,$groupname,$state,$action,$page,$states, |
|
\%stored); |
|
} elsif ($state eq 'result') { |
|
&reenable_group($r,$cdom,$cnum,$groupname); |
|
} |
} |
} |
} |
} |
|
|
Line 1124 sub delete_group {
|
Line 1154 sub delete_group {
|
foreach my $key (sort(keys(%membership))) { |
foreach my $key (sort(keys(%membership))) { |
if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) { |
if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) { |
my $user = $1; |
my $user = $1; |
my($end,$start,@userprivs) = split(/:/,$membership{$key}); |
my($end,$start,$userprivs) = split(/:/,$membership{$key},3); |
if ($start != -1) { |
if ($start != -1) { |
$num_users ++; |
$num_users ++; |
$usersettings{$groupname.':'.$user} = $now.':-1:'; |
$usersettings{$groupname.':'.$user} = $now.':-1:'.$userprivs; |
if (&Apache::lonnet::modify_group_roles($cdom,$cnum, |
if (&Apache::lonnet::modify_group_roles($cdom,$cnum, |
$groupname,$user, |
$groupname,$user, |
$now,'-1','') |
$now,'-1',$userprivs) |
eq 'ok') { |
eq 'ok') { |
$num_ok ++; |
$num_ok ++; |
push(@deleted,$user); |
push(@deleted,$user); |
Line 1147 sub delete_group {
|
Line 1177 sub delete_group {
|
\%usersettings); |
\%usersettings); |
} |
} |
if ($num_fail > 0) { |
if ($num_fail > 0) { |
$r->print(&mt('Group deletion failed because deletion of [_1] out of [_2] members failed',$num_fail,$num_users)); |
$r->print(&mt('Group deletion failed because deletion of [_1] out of [_2] members failed.',$num_fail,$num_users)); |
|
|
} else { |
} else { |
my ($result,$message) = |
my ($result,$message) = |
&Apache::lonnet::delete_coursegroup($cdom,$cnum,$groupname); |
&Apache::lonnet::toggle_coursegroup_status($cdom,$cnum, |
|
$groupname,'delete'); |
if ($result eq 'ok') { |
if ($result eq 'ok') { |
my $outcome = &modify_folders($cdom,$cnum,$groupname); |
my $outcome = &modify_folders($cdom,$cnum,$groupname); |
if ($outcome eq '') { |
if ($outcome eq '') { |
$r->print(&mt('Group successfully deleted')); |
$r->print(&mt('Group successfully deleted.')); |
} else { |
} 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)); |
$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 { |
} else { |
$r->print(&mt('Group deletion failed')); |
$r->print(&mt('Group deletion failed.')); |
} |
} |
} |
} |
return; |
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".'<br />'; |
|
} 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".'<br />'; |
|
} else { |
|
my ($furl,$ferr) = |
|
&Apache::lonuserstate::readmap($cdom.'/'.$cnum); |
|
} |
|
} |
|
return $outcome; |
|
} |
|
|
sub modify_folders { |
sub modify_folders { |
my ($cdom,$cnum,$groupname) = @_; |
my ($cdom,$cnum,$groupname) = @_; |
my $outcome; |
my $outcome; |
Line 1173 sub modify_folders {
|
Line 1233 sub modify_folders {
|
my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'. |
my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'. |
$groupname.'.sequence'; |
$groupname.'.sequence'; |
my $groupmapres = $navmap->getResourceByUrl($groupmap); |
my $groupmapres = $navmap->getResourceByUrl($groupmap); |
|
my ($map,$id,$src); |
if ($groupmapres) { |
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; |
$map = '/'.$map; |
my ($errtext,$fatal) = &LONCAPA::map::mapread($map); |
my ($errtext,$fatal) = &LONCAPA::map::mapread($map); |
if ($fatal) { |
if ($fatal) { |
Line 1201 sub modify_folders {
|
Line 1265 sub modify_folders {
|
} |
} |
$#LONCAPA::map::order--; |
$#LONCAPA::map::order--; |
my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1); |
my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1); |
if ($outtext) { |
if ($errtext) { |
$outcome = &mt('Error storing updated parent folder to group'). " ($map): $errtext".'<br />'; |
$outcome = &mt('Error storing updated parent folder to group'). "- $map - $errtext".'<br />'; |
return; |
} else { |
} |
my ($furl,$ferr) = |
|
&Apache::lonuserstate::readmap($cdom.'/'.$cnum); |
|
} |
} |
} |
} |
} |
} |
} |
undef($navmap); |
|
return $outcome; |
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: ").'<i>'. |
|
$stored->{'description'}.'</i>'. |
|
'<br /><br />'.&mt('When a deleted group is re-enabled the following occurs:').'<ul>'. |
|
'<li>'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'</li>'. |
|
'<li>'.&mt('A group folder is added to the "Course Groups" folder which contains folders for all groups in the course.').'</li></ul>'); |
|
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).'<br />'); |
|
} |
|
} 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).'<br />'); |
|
} |
|
} else { |
|
$r->print(&mt('There were no group members to reinstate, as none were removed when the group was deleted.').'<br />'); |
|
} |
|
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 { |
sub header { |
my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_; |
my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_; |
my $start_page= |
my $start_page= |
Line 3713 sub validate_groupname {
|
Line 3871 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); |
my %deleted_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef, |
|
'deleted_groups'); |
if (my $tmp = &Apache::lonnet::error(%deleted_groups)) { |
if (my $tmp = &Apache::lonnet::error(%deleted_groups)) { |
undef(%deleted_groups); |
undef(%deleted_groups); |
&Apache::lonnet::logthis('Error retrieving groups: '.$tmp.' in '.$cnum.':'.$cdom); |
&Apache::lonnet::logthis('Error retrieving groups: '.$tmp.' in '.$cnum.':'.$cdom); |