--- loncom/interface/loncoursegroups.pm 2006/02/18 01:27:07 1.5 +++ loncom/interface/loncoursegroups.pm 2006/02/21 18:56:00 1.6 @@ -88,8 +88,8 @@ sub handler { \%functions,\%idx,$view_permission, $manage_permission,$rowColor1,$rowColor2); } else { - $r->print('You do not have group administration '. - 'privileges in this course'); + $r->print(&mt('You do not have group administration '. + 'privileges in this course')); } } else { &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx, @@ -129,10 +129,22 @@ sub display_groups { delete => ' - Action - Group Name - Description - Creator + $lt{'act'} + $lt{'gname'} + $lt{'desc'} + $lt{'crea'} - Created + $lt{'crtd'} - Last Modified + $lt{'last'} - Functionality + $lt{'func'} - Quota (Mb) - Members - Files - Discussion boards - Disk use + $lt{'quot'} + $lt{'memb'} + $lt{'file'} + $lt{'dibd'} + $lt{'dius'} END my %Sortby = (); @@ -218,12 +230,12 @@ END my $diskuse = $grp_info{$group}{'diskuse'}; my $functionality; foreach my $tool (sort(keys(%{$functions}))) { - if (defined($grp_info{$group}{functions}{$tool})) { + if ($grp_info{$group}{functions}{$tool} eq 'on') { $functionality .= ' '.$tool; } } if (!$functionality) { - $functionality = 'None available'; + $functionality = &mt('None available'); } my $link = $actionlinks{$action}; if ($action eq 'modify' || $action eq 'delete') { @@ -231,7 +243,7 @@ END } else { $link .= $group.'/grppg?register=1'; } - $link .= '">'.$actiontext{$action}.''; + $link .= '">'.$lt{$action}.''; $r->print(''.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.$totalfiles.''.$boards.''.$diskuse.''); $rowNum ++; } @@ -256,7 +268,8 @@ END } } } 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 groups in this course')); } } return; @@ -276,7 +289,7 @@ sub group_administration { my %usertools = (); my %stored = (); my %memchg; - my @member_changes = ('delete','expire','activate','reenable', + my @member_changes = ('deletion','expire','activate','reenable', 'changefunc','changepriv'); my $state = $env{'form.state'}; my ($groupname,$description,$startdate,$enddate,$granularity,$specificity); @@ -315,23 +328,6 @@ sub group_administration { } } - if (($action eq 'modify') && (($state eq 'change_privs') || ($state eq 'memresult'))) { - foreach my $chg (@member_changes) { - if (defined($env{'form.'.$chg})) { - @{$memchg{$chg}} = &Apache::loncommon::get_env_multiple('form.'.$chg); - } - } - &check_changes(\@member_changes,\%memchg); - foreach my $change (@member_changes) { - if (($change eq 'delete') || ($change eq 'expire')) { - next; - } - foreach my $user (@{$memchg{$change}}) { - %{$usertools{$user}} = (); - } - } - } - if ($action eq 'modify') { if ($state eq '') { $state = 'pick_group'; @@ -471,9 +467,11 @@ sub group_administration { } } - if (($state eq 'pick_members') || ($state eq 'pick_privs')) { - &build_members_list($cdom,$cnum,\@types,\@roles, - \@sections,\%users,\%userdata); + if (($state eq 'pick_members') || ($state eq 'pick_privs') || ($state eq 'change_privs')) { + &build_members_list($cdom,$cnum,\@types,\@roles,\@sections,\%users, + \%userdata); + } + if ($state eq 'pick_members') { if ((keys(%users) > 0) && (@tools > 0)) { foreach my $tool (@tools) { if ($granularity eq 'Yes') { @@ -483,6 +481,62 @@ sub group_administration { $elements{$action}{'pick_members'}{'specificity'} = 'radio'; } } + if ($state eq 'change_members') { + my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, + $groupname); + my $now = time; + my $num_expire = 0; + my $num_activate = 0; + my $num_reenable = 0; + my $num_deletion = 0; + my $numusers = 0; + foreach my $key (sort(keys(%membership))) { + if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) { + my $user = $1; + my($end,$start,@userprivs) = split(/:/,$membership{$key}); + unless ($start == -1) { + $numusers ++; + $num_deletion ++; + if (($end > 0) && ($end < $now)) { + $num_reenable ++; + next; + } elsif (($start > $now)) { + $num_activate = 1; + next; + } else { + $num_expire ++; + next; + } + next; + } + if ($num_reenable && $num_activate && $num_expire) { + last; + } + } + } + if ($num_deletion) { + $elements{$action}{'change_members'}{'deletion'} = 'checkbox'; + } + if ($num_expire) { + $elements{$action}{'change_members'}{'expire'} = 'checkbox'; + } + if ($num_activate) { + $elements{$action}{'change_members'}{'activate'} = 'checkbox'; + } + if ($num_reenable) { + $elements{$action}{'change_members'}{'reenable'} = 'checkbox'; + } + if ($numusers) { + foreach my $tool (@tools) { + if ($granularity eq 'Yes') { + $elements{$action}{'change_members'}{'user_'.$tool} = 'checkbox'; + } + } + if ($specificity eq 'Yes') { + $elements{$action}{'change_members'}{'changepriv'} = 'checkbox'; + } + } + } if (($state eq 'pick_privs') || ($state eq 'change_privs') || (($specificity eq 'No') && @@ -495,17 +549,109 @@ sub group_administration { } } } - if ((($state eq 'pick_privs') || ($state eq 'change_privs')) - && ($specificity eq 'Yes')) { - foreach my $user (sort(keys(%usertools))) { - foreach my $tool (keys(%{$usertools{$user}})) { - foreach my $priv (keys(%{$toolprivs{$tool}})) { - unless (exists($fixedprivs{$tool}{$priv})) { - $elements{$action}{$state}{'userpriv_'.$priv} = 'checkbox'; + } + + if (($action eq 'modify') && (($state eq 'change_privs') || ($state eq 'memresult'))) { + foreach my $chg (@member_changes) { + if (defined($env{'form.'.$chg})) { + @{$memchg{$chg}} = &Apache::loncommon::get_env_multiple('form.'.$chg); + } + } + + if ($state eq 'change_privs') { + my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, + $groupname); + my $now = time; + foreach my $key (sort(keys(%membership))) { + if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) { + my $user = $1; + my $changefunc = 0; + my ($end,$start,@userprivs) = split(/:/,$membership{$key}); + unless ($start == -1) { + if (($end > 0) && ($end < $now)) { + unless (grep/^$user$/,$memchg{'reenable'}) { + next; + } + } + my @currtools = (); + if (@userprivs > 0) { + foreach my $tool (sort(keys(%fixedprivs))) { + foreach my $priv (keys(%{$fixedprivs{$tool}})) { + if (grep/^$priv$/,@userprivs) { + push(@currtools,$tool); + last; + } + } + } + } + foreach my $tool (@currtools) { + if (keys(%{$usertools{$user}}) > 0) { + if (!$usertools{$user}{$tool}) { + push(@{$memchg{'changefunc'}},$user); + $changefunc = 1; + last; + } + } else { + push(@{$memchg{'changefunc'}},$user); + $changefunc = 1; + } + } + if ($changefunc) { + next; + } + if (keys(%{$usertools{$user}}) > 0) { + foreach my $tool (keys(%{$usertools{$user}})) { + if (!grep/^$tool$/,@currtools) { + push(@{$memchg{'changefunc'}},$user); + $changefunc = 1; + last; + } + } } } } } + &check_changes(\@member_changes,\%memchg); + my %temptools; + foreach my $change (@member_changes) { + if (($change eq 'deletion') || ($change eq 'expire')) { + next; + } + foreach my $user (@{$memchg{$change}}) { + unless (exists($usertools{$user})) { + %{$usertools{$user}} = (); + } + %{$temptools{$user}} = %{$usertools{$user}}; + } + } + %usertools = %temptools; + } elsif ($state eq 'memresult') { + foreach my $change (@member_changes) { + if ($change eq 'expire' || $change eq 'deletion') { + next; + } + if (ref($memchg{$change}) eq 'ARRAY') { + my @users = @{$memchg{$change}}; + foreach my $user (@users) { + unless (exists($usertools{$user})) { + %{$usertools{$user}} = (); + } + } + } + } + } + } + + if ((($state eq 'pick_privs') || ($state eq 'change_privs')) + && ($specificity eq 'Yes')) { + foreach my $user (sort(keys(%usertools))) { + foreach my $tool (keys(%{$usertools{$user}})) { + foreach my $priv (keys(%{$toolprivs{$tool}})) { + unless (exists($fixedprivs{$tool}{$priv})) { + $elements{$action}{$state}{'userpriv_'.$priv} = 'checkbox'; + } + } + } } } @@ -519,6 +665,11 @@ function backPage(formname,prevstate) { formname.state.value = prevstate; formname.submit(); } +function changeSort(caller) { + document.$state.state.value = '$state'; + document.$state.sortby.value = caller; + document.$state.submit(); +} |; $jscript .= &Apache::lonhtmlcommon::set_form_elements( @@ -767,7 +918,7 @@ sub display_control { $startdate,$enddate,$tools,$functions, $toolprivs,$fixedprivs,$userdata,$usertools, $memchg,$idx,$states,$stored,$sectioncount, - $navbuttons,$rowColor1,$rowColor2) = @_; + $navbuttons,$rowColor1,$rowColor2); } elsif ($state eq 'chgresult' || $state eq 'memresult' || $state eq 'addresult') { &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page, @@ -829,6 +980,7 @@ sub onload_action { sub footer { return(< @@ -870,12 +1022,14 @@ sub group_members { foreach my $member (keys %memberhash) { $totalmembers ++; my ($end,$start) = split(/:/,$memberhash{$member}); - if (($end!=0) && ($end<$now)) { - $previous ++; - } elsif (($start!=0) && ($start>$now)) { - $future ++; - } else { - $active ++; + unless ($start == -1) { + if (($end!=0) && ($end<$now)) { + $previous ++; + } elsif (($start!=0) && ($start>$now)) { + $future ++; + } else { + $active ++; + } } } if ($totalmembers == 0) { @@ -1030,7 +1184,7 @@ sub membership_options { 'picr' => 'Pick the criteria to use to build a list of '. 'course users from which you will select ', 'meof' => 'members of the new group.', - 'adme' => 'additional members of the group.', + 'admg' => 'additional members of the group.', 'ifno' => 'If you do not wish to add members when you first '. 'create the group, do not make any selections', 'acty' => 'Access types', @@ -1056,7 +1210,7 @@ sub membership_options { if ($action eq 'create') { $r->print($lt{'meof'}.'
'.$lt{'ifno'}); } else { - $r->print($lt{'adme'}); + $r->print($lt{'admg'}); } $r->print('
@@ -1155,7 +1309,7 @@ sub choose_members_form { my %origmembers; $r->print(&Apache::lonhtmlcommon::echo_form_input( ['origin','action','state','page','member','specificity','branch', - 'defpriv','autorole','autoadd','autodrop'], + 'defpriv','autorole','autoadd','autodrop','sortby'], \@regexps)); my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum); $r->print(' @@ -1189,10 +1343,13 @@ sub choose_members_form { $groupname); foreach my $key (sort(keys(%membership))) { if ($key =~ /^\Q$groupname\E:([^:]+):([^:]+)$/) { - my $uname = $1; - my $udom = $2; - my $user = $uname.':'.$udom; - $origmembers{$user} = 1; + my ($end,$start,@userprivs) = split(/:/,$membership{$key}); + unless ($start == -1) { + my $uname = $1; + my $udom = $2; + my $user = $uname.':'.$udom; + $origmembers{$user} = 1; + } } } } @@ -1824,8 +1981,9 @@ sub change_members_form { ); my @regexps = ('user_','userpriv_'); $r->print(&Apache::lonhtmlcommon::echo_form_input( - ['origin','action','state','page','expire','delete', - 'changefunc','changepriv'],\@regexps)); + ['origin','action','state','page','expire','deletion', + 'reenable','activate','changepriv','sortby'], + \@regexps)); my $rowimg = 1; my @available = (); my @unavailable = (); @@ -1869,12 +2027,17 @@ sub current_membership { my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, $groupname); my %lt = &Apache::lonlocal::texthash( + 'actn' => 'Action?', + 'name' => 'Name', + 'usnm' => 'Username', + 'doma' => 'Domain', + 'stda' => 'Start Date', + 'enda' => 'End Date', 'expi' => 'Expire', 'reen' => 'Re-enable', 'acti' => 'Activate', 'dele' => 'Delete', 'curf' => 'Current Functionality', - 'chfn' => 'Change Functions', 'chpr' => 'Change Privileges' ); if (keys(%membership) > 0) { @@ -1976,11 +2139,8 @@ sub current_membership { if ($num_activate) { &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'}); } - &check_uncheck_buttons($r,$formname,'delete',$lt{'dele'}); + &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'}); if (@{$available} > 0) { - if ($granularity eq 'Yes') { - &check_uncheck_buttons($r,$formname,'changefunc',$lt{'chfn'}); - } if ($specificity eq 'Yes') { &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'}); } @@ -2018,22 +2178,39 @@ END $r->print(<<"END"); - - - + + - + - - + + END + my $colspan = 0; if ($hastools) { $r->print(''); + $colspan ++; } if ($addtools) { $r->print(''); + $colspan ++; } $r->print(''); + if ($colspan) { + if ($granularity eq 'Yes') { + $r->print(' + + '); + } + } my %Sortby = (); foreach my $user (sort(keys(%current))) { if ($env{'form.sortby'} eq 'fullname') { @@ -2079,13 +2256,8 @@ END $lt{'acti'}.'
'); } $r->print(''. - ''. + ''. $lt{'dele'}.''); - if ($granularity eq 'Yes') { - $r->print('
'. - ''.$lt{'chfn'}. - ''); - } if ($specificity eq 'Yes') { $r->print('
'. ''.$lt{'chpr'}. @@ -2098,7 +2270,8 @@ END $udom.''); if ($hastools) { - $r->print(''); + $r->print(''); } - $r->print('
Action?NameUsername + $lt{'actn'}$lt{'name'}$lt{'usnm'} Domain$lt{'doma'} IDStart DateEnd Date$lt{'stda'}$lt{'enda'}'.$lt{'curf'}.'Additional Functionality
 '.&mt('All:'). + ' '); + foreach my $tool (@{$available}) { + $r->print(''. + ''.$tool.'   '); + } + $r->print('
'.$id.''.$start. ''.$end.''); + $r->print(''. + '      '); foreach my $tool (@{$current{$user}{currtools}}) { if ($granularity eq 'Yes') { $r->print(' 'To be deleted', + 'toex' => 'To be expired', + 'nome' => 'No members to be deleted or expired from the group.', + ); $r->print(&Apache::lonhtmlcommon::echo_form_input( - ['origin','action','state','page'],\@regexps)); - $nexttext = $$navbuttons{'adme'}; - + ['origin','action','state','page','sortby'],\@regexps)); + if ($env{'form.branch'} eq 'adds') { + $nexttext = $$navbuttons{'adme'}; + } else { + $nexttext = $$navbuttons{'mose'}; + } $r->print('
'); + &topic_bar($r,$tabcol,3,&mt('Members to delete or expire')); + my $exp_or_del = 0; + if (ref($$memchg{'deletion'}) eq 'ARRAY') { + if (@{$$memchg{'deletion'}} > 0) { + $r->print(''); + $exp_or_del += @{$$memchg{'deletion'}}; + } + } + if (ref($$memchg{'expire'}) eq 'ARRAY') { + if (@{$$memchg{'expire'}} > 0) { + $r->print(''); + $exp_or_del += @{$$memchg{'expire'}}; + } + } + if (!$exp_or_del) { + $r->print(''); + } - &topic_bar($r,$tabcol,3,&mt('Group member privileges')); - - &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs, - $fixedprivs,$userdata,$usertools,$idx,$memchg, - $states,$stored,$rowColor1,$rowColor2); - + &topic_bar($r,$tabcol,4,&mt('Group member privileges')); + + my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools, + $toolprivs,$fixedprivs,$userdata, + $usertools,$idx,$memchg,$states, + $stored,$rowColor1,$rowColor2); $r->print(''); my $prevtext = $$navbuttons{'gtps'}; - &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, - $$states{$action}[$page+1],$nexttext); + if ($numchgs || $exp_or_del) { + &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, + $$states{$action}[$page+1],$nexttext); + } else { + &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext); + } $r->print('
 '.$lt{'tode'}.':
    '); + foreach my $user (@{$$memchg{'deletion'}}) { + $r->print('
  • '.$$userdata{$user}[$$idx{fullname}]. + ' ('.$user.')
  • '); + } + $r->print('
 
 '.$lt{'toex'}.':
    '); + foreach my $user (@{$$memchg{'expire'}}) { + $r->print('
  • '.$$userdata{$user}[$$idx{fullname}]. + ' ('.$user.')
  • '); + } + $r->print('
 
 '.$lt{'nome'}. + '
 
 
'); return; } @@ -2238,12 +2450,12 @@ sub choose_privs_form { if ($action eq 'create') { push(@regexps,'sec_'); $r->print(&Apache::lonhtmlcommon::echo_form_input( - ['origin','action','state','page','autoadd','autodrop'], + ['origin','action','state','page','sortby','autoadd','autodrop'], \@regexps)); $nexttext = $$navbuttons{'crgr'}; } else { $r->print(&Apache::lonhtmlcommon::echo_form_input( - ['origin','action','state','page'],\@regexps)); + ['origin','action','state','page','sortby'],\@regexps)); $nexttext = $$navbuttons{'adme'}; } @@ -2273,21 +2485,28 @@ sub choose_privs_form { sub build_boxes { my ($r,$tools,$usertools,$fixedprivs,$toolprivs,$showtools, - $showboxes,$prefix,$specificity) = @_; + $showboxes,$prefix,$specificity,$excluded) = @_; my $totalboxes = 0; if (@{$tools} > 0) { if ($specificity eq 'Yes') { foreach my $tool (@{$tools}) { @{$$showboxes{$tool}} = (); foreach my $user (sort(keys(%{$usertools}))) { - unless (grep/^$tool$/,@{$showtools}) { - push(@{$showtools},$tool); + if (ref($excluded) eq 'ARRAY') { + if (grep/^$user$/,@{$excluded}) { + next; + } } - foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { - unless (exists($$fixedprivs{$tool}{$priv})) { - unless(grep(/^$priv$/,@{$$showboxes{$tool}})) { - push(@{$$showboxes{$tool}},$priv); - $totalboxes ++; + if ($$usertools{$user}{$tool}) { + unless (grep/^$tool$/,@{$showtools}) { + push(@{$showtools},$tool); + } + foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { + unless (exists($$fixedprivs{$tool}{$priv})) { + unless(grep(/^$priv$/,@{$$showboxes{$tool}})) { + push(@{$$showboxes{$tool}},$priv); + $totalboxes ++; + } } } } @@ -2338,6 +2557,10 @@ sub member_privileges_form { 'there are no specific user privileges to set.', 'asng' => 'As no group tools will be made available to users, '. 'there are no specific user privileges to set.', + 'nogm' => 'No group member privileges to display or set, '. + 'as you have not indicated that you will be activating,'. + ' re-enabling, changing privileges, or adding/removing '. + 'functionality for any current members ', 'full' => 'Fullname', 'user' => 'Username', 'doma' => 'Domain', @@ -2355,43 +2578,72 @@ sub member_privileges_form { } my @showtools; my %showboxes = (); - my $totalboxes = 0; my $numtools = 1 + @{$tools}; - $totalboxes = &build_boxes($r,$tools,$usertools,$fixedprivs,$toolprivs, - \@showtools,\%showboxes,'userpriv_', - $specificity); + my @excluded = (); + my $numchgs = 0; + if ($formname eq 'change_privs') { + my @currmembers = (); + if (ref($$memchg{'deletion'}) eq 'ARRAY') { + push(@excluded,@{$$memchg{'deletion'}}); + } + if (ref($$memchg{'expire'}) eq 'ARRAY') { + push(@excluded,@{$$memchg{'expire'}}); + } + if (@excluded > 0) { + foreach my $user (sort(keys(%{$usertools}))) { + if (grep/^$user$/,@excluded) { + next; + } + push(@currmembers,$user); + } + } else { + @currmembers = sort(keys(%{$usertools})); + } + $numchgs = @currmembers; + if (!$numchgs) { + $r->print('
 '.$lt{'nogm'}); + return $numchgs; + } + } + + my $totalboxes = &build_boxes($r,$tools,$usertools,$fixedprivs, + $toolprivs,\@showtools,\%showboxes, + 'userpriv_',$specificity,\@excluded); if (@{$tools} > 0) { if ($specificity eq 'Yes') { if ($totalboxes > 0) { my $numcells = 2; my $colspan = $numcells + 1; my %total; - $r->print(' + if (keys(%{$usertools}) > 1) { + $r->print('
  '); - foreach my $tool (@{$tools}) { - if (@{$showboxes{$tool}} > 0) { - $r->print(''); } + $r->print('
'); - $r->print(''); - my $privcount = 0; - foreach my $priv (@{$showboxes{$tool}}) { - $privcount ++; - if (($privcount == @{$showboxes{$tool}}) && ($privcount > 1)) { - if ($privcount%$numcells) { - $r->print(''); } - $r->print('
'.$tool.'
'); + foreach my $tool (@{$tools}) { + if (@{$showboxes{$tool}} > 0) { + $r->print(''); + $r->print(''); + my $privcount = 0; + foreach my $priv (@{$showboxes{$tool}}) { + $privcount ++; + if (($privcount == @{$showboxes{$tool}}) && + ($privcount > 1)) { + if ($privcount%$numcells) { + $r->print(''); - if ($privcount < @{$showboxes{$tool}}) { - if (@{$showboxes{$tool}} > 2) { - if ($privcount%$numcells == 0) { - $r->print(''); + $r->print(''); + if ($privcount < @{$showboxes{$tool}}) { + if (@{$showboxes{$tool}} > 2) { + if ($privcount%$numcells == 0) { + $r->print(''); + } + } else { + $r->print(''); } - } else { - $r->print(''); } } + $r->print('
'. + $tool.'
'); + } else { + $r->print(''); + } } else { $r->print(''); } - } else { - $r->print(''); - } - $r->print(qq| + $r->print(qq|
$$toolprivs{$tool}{$priv}

|); - $r->print('
 
 
 
'); - $r->print('  '); + $r->print(' '); $r->print(&Apache::lonhtmlcommon::start_pick_box()); $r->print(<<"END"); @@ -2427,7 +2681,8 @@ sub member_privileges_form { END &member_privs_entries($r,$tabcol,$rowColor1,$rowColor2, $usertools,$toolprivs,$fixedprivs, - $userdata,$idx,\@showtools,\@defprivs); + $userdata,$idx,\@showtools,\@defprivs, + \@excluded); $r->print(''); $r->print(&Apache::lonhtmlcommon::end_pick_box()); $r->print(' @@ -2456,7 +2711,7 @@ END } else { $r->print(' '.$lt{'asng'}); } - return; + return $numchgs; } sub process_request { @@ -2466,7 +2721,7 @@ sub process_request { $sectioncount,$stored,$rowColor1,$rowColor2) = @_; $r->print(&Apache::lonhtmlcommon::echo_form_input( - ['origin','action','state','page'])); + ['origin','action','state','page','sortby'])); my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum); if ($earlyout) { @@ -2516,9 +2771,9 @@ sub process_request { } if (($action eq 'create' && $outcome eq 'ok') || (($action eq 'modify') && (($state eq 'memresult') || ($state eq 'addresult')))) { - &process_membership($r,$cdom,$cnum,$groupname,$tools,$enddate, - $startdate,$userdata,$idx,$toolprivs,$usertools, - $specificity,\@defprivs); + &process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools, + $enddate,$startdate,$userdata,$idx,$toolprivs, + $usertools,$specificity,\@defprivs,$memchg); } return; } @@ -2621,11 +2876,13 @@ sub write_group_data { } sub process_membership { - my ($r,$cdom,$cnum,$groupname,$tools,$enddate,$startdate,$userdata,$idx, - $toolprivs,$usertools,$specificity,$defprivs) = @_; + my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate, + $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg)=@_; my %usersettings = (); - my @added= (); - my @failed = (); + my %added= (); + my %failed = (); + my $num_ok = 0; + my $num_fail = 0; my %group_privs = (); my %tooltype = (); @@ -2655,40 +2912,126 @@ sub process_membership { $group_privs{$user} =~ s/:$//; } + my $now = time; + my @activate = (); + my @expire = (); + my @deletion = (); + my @reenable = (); + if ($state eq 'memresult') { + if (ref($$memchg{'activate'}) eq 'ARRAY') { + @activate = @{$$memchg{'activate'}}; + } + if (ref($$memchg{'expire'}) eq 'ARRAY') { + @expire = @{$$memchg{'expire'}}; + } + if (ref($$memchg{'deletion'}) eq 'ARRAY') { + @deletion = @{$$memchg{'deletion'}}; + } + if (ref($$memchg{'reenable'}) eq 'ARRAY') { + @reenable = @{$$memchg{'reenable'}}; + } + if (@expire + @deletion > 0) { + my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, + $groupname); + foreach my $user (@expire) { + my ($currend,$currstart,@userprivs) = + split(/:/,$membership{$groupname.':'.$user}); + $group_privs{$user} = join(':',@userprivs); + if ($currstart > $now) { + $currstart = $now; + } + $usersettings{$groupname.':'.$user} = $now.':'.$currstart.':'. + $group_privs{$user}; + if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname, + $user,$now,$currstart, + $group_privs{$user}) eq 'ok') { + push(@{$added{'expired'}},$user); + $num_ok ++; + } else { + push(@{$failed{'expired'}},$user); + $num_fail ++; + } + } + foreach my $user (@deletion) { + $usersettings{$groupname.':'.$user} = $now.':-1:'; + if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname, + $user,$now,'-1','') + eq 'ok') { + push(@{$added{'deleted'}},$user); + $num_ok ++; + } else { + push(@{$failed{'deleted'}},$user); + $num_fail ++; + } + } + } + } + foreach my $user (sort(keys(%{$usertools}))) { - $usersettings{$groupname.':'.$user} = $enddate.':'.$startdate.':'. + my $type; + my $start = $startdate; + my $end = $enddate; + if ($state eq 'memresult') { + $type = 'modified'; + if (@activate > 0) { + if (grep/^$user$/,@activate) { + $start = $now; + $type = 'activated'; + } + } + if (@reenable > 0) { + if (grep/^$user$/,@reenable) { + $type = 'reenabled'; + } + } + } else { + $type = 'added'; + } + $usersettings{$groupname.':'.$user} = $end.':'.$start.':'. $group_privs{$user}; if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname, - $user,$enddate,$startdate, + $user,$end,$start, $group_privs{$user}) eq 'ok') { - push(@added,$user); + push(@{$added{$type}},$user); + $num_ok ++; } else { - push(@failed,$user); + push(@{$failed{$type}},$user); + $num_fail ++; } } my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom, $cnum,\%usersettings); - if (@added > 0) { - $r->print('Users were added with following privileges:
'); - foreach my $user (@added) { - my @privs = split(/:/,$group_privs{$user}); - my $privlist= ''; - my $curr_tool = ''; - foreach my $priv (@privs) { - unless ($curr_tool eq $tooltype{$priv}) { - $curr_tool = $tooltype{$priv}; - $privlist .= ''.$curr_tool.': '; - } - $privlist .= $$toolprivs{$curr_tool}{$priv}.', '; - } - $privlist =~ s/, $//; - $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.': '.$privlist.'
'); - } - } - if (@failed > 0) { - $r->print('Addition of the following users was unsuccessful:
'); - foreach my $user (@failed) { - $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'
'); + if ($num_ok) { + foreach my $type (sort(keys(%added))) { + $r->print(&mt('The following users were successfully [_1]',$type)); + if ($type eq 'activated' || $type eq 'added' || $type eq 'reenabled') { + $r->print(&mt(' with the following privileges')); + } + $r->print(':
'); + foreach my $user (@{$added{$type}}) { + my $privlist; + if ($type eq 'activated' || $type eq 'added') { + my @privs = split(/:/,$group_privs{$user}); + my $curr_tool = ''; + foreach my $priv (@privs) { + unless ($curr_tool eq $tooltype{$priv}) { + $curr_tool = $tooltype{$priv}; + $privlist .= ''.$curr_tool.': '; + } + $privlist .= $$toolprivs{$curr_tool}{$priv}.', '; + } + $privlist =~ s/, $//; + } + $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.': '.$privlist.'
'); + } + } + } + if ($num_fail) { + foreach my $type (sort(keys(%failed))) { + $r->print(&mt('The following users could not be [_1], because an error occurred:
',$type)); + foreach my $user (@{$failed{$type}}) { + $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'
'); + } } } if ($roster_result eq 'ok') { @@ -2870,8 +3213,8 @@ sub modify_menu { state => 'change_settings', branch => 'settings', }, - { text => 'Modify access, tools and/or privileges for previous,future'. - 'or current members', + { text => 'Modify access, tools and/or privileges for previous, '. + 'future, or current members', help => 'Course_Modify_Group_Membership', state => 'change_members', branch => 'members', @@ -2899,10 +3242,17 @@ sub modify_menu { sub member_privs_entries { my ($r,$tabcol,$rowColor1,$rowColor2,$usertools,$toolprivs, - $fixedprivs,$userdata,$idx,$showtools,$defprivs) = @_; + $fixedprivs,$userdata,$idx,$showtools,$defprivs,$excluded) = @_; my $rowColor; my $rowNum = 0; foreach my $user (sort(keys(%{$usertools}))) { + if (defined($excluded)) { + if (ref($excluded) eq 'ARRAY') { + if (grep/^$user$/,@{$excluded}) { + next; + } + } + } my ($uname,$udom) = split(/:/,$user); if ($rowNum %2 == 1) { $rowColor = $rowColor1; @@ -3118,10 +3468,10 @@ sub check_changes { @{$exclusions{'changepriv'}} = ('expire','changefunc'); foreach my $change (@{$member_changes}) { - if ($change eq 'delete') { + if ($change eq 'deletion') { next; } - my @checks = ('delete'); + my @checks = ('deletion'); if (exists($exclusions{$change})) { push(@checks,@{$exclusions{$change}}); } @@ -3129,10 +3479,14 @@ sub check_changes { foreach my $item (@{$$memchg{$change}}) { my $match = 0; foreach my $check (@checks) { - if (@{$$memchg{$check}} > 0) { - if (grep/^$item$/,@{$$memchg{$check}}) { - $match = 1; - last; + if (defined($$memchg{$check})) { + if (ref(@{$$memchg{$check}}) eq 'ARRAY') { + if (@{$$memchg{$check}} > 0) { + if (grep/^$item$/,@{$$memchg{$check}}) { + $match = 1; + last; + } + } } } }