');
}
}
} else {
@@ -287,7 +315,7 @@ END
}
sub group_administration {
- my ($r,$action,$cdom,$cnum,$function,$tabcol,$functions,$idx,
+ my ($r,$action,$state,$cdom,$cnum,$function,$tabcol,$functions,$idx,
$view_permission,$manage_permission,$rowColor1,$rowColor2) = @_;
my %sectioncount = ();
my @tools = ();
@@ -302,7 +330,6 @@ sub group_administration {
my %memchg;
my @member_changes = ('deletion','expire','activate','reenable',
'changefunc','changepriv');
- my $state = $env{'form.state'};
my ($groupname,$description,$startdate,$enddate,$granularity,$specificity);
if (defined($env{'form.groupname'})) {
@@ -341,7 +368,11 @@ sub group_administration {
if ($action eq 'modify') {
if ($state eq '') {
- $state = 'pick_group';
+ if (defined($env{'form.groupname'})) {
+ $state = 'pick_task';
+ } else {
+ $state = 'pick_group';
+ }
} else {
%stored = &retrieve_settings($cdom,$cnum,$groupname);
if (ref($stored{'types'}) eq 'ARRAY') {
@@ -433,7 +464,10 @@ sub group_administration {
);
if (ref($stored{'autorole'}) eq 'ARRAY') {
foreach my $role (@{$stored{'autorole'}}) {
- $elements{'modify'}{'change_settings'}{'sec_'.$role} = 'selectbox';
+ unless ($role eq 'cc') {
+ $elements{'modify'}{'change_settings'}{'sec_'.$role} =
+ 'selectbox';
+ }
}
}
%{$elements{'create'}{'pick_members'}} = (
@@ -472,7 +506,7 @@ sub group_administration {
}
if (defined($env{'form.sectionpick'})) {
@sections=&Apache::loncommon::get_env_multiple('form.sectionpick');
- if (grep/^_all$/,@sections) {
+ if (grep/^all$/,@sections) {
@sections = sort {$a cmp $b} keys(%sectioncount);
}
}
@@ -556,11 +590,17 @@ sub group_administration {
}
if (($state eq 'pick_privs') || ($state eq 'change_privs') ||
- (($specificity eq 'No') &&
- (($state eq 'result') || ($state eq 'memresult')))) {
+ (($specificity eq 'No') &&
+ ($state eq 'memresult' || $state eq 'result' || $state eq 'addresult'))) {
foreach my $tool (@tools) {
my @values = &Apache::loncommon::get_env_multiple('form.user_'.$tool);
foreach my $user (@values) {
+ if ($state eq 'pick_privs' || $state eq 'result'
+ || $state eq 'addresult') {
+ if (!grep(/^\Q$user\E$/,@members)) {
+ next;
+ }
+ }
unless(exists($usertools{$user}{$tool})) {
$usertools{$user}{$tool} = 1;
}
@@ -701,7 +741,7 @@ function changeSort(caller) {
@{$branchstates{'members'}} = ('change_members','change_privs','memresult');
@{$branchstates{'adds'}} = ('add_members','pick_members','pick_privs',
'addresult');
-
+
if (defined($env{'form.branch'})) {
push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}});
}
@@ -797,7 +837,7 @@ function changeSort(caller) {
$r->print(&Apache::lonhtmlcommon::breadcrumbs
('Course Groups Manager'));
&display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
- $view_permission,$manage_permission,$action,
+ $view_permission,$manage_permission,$action,$state,
$rowColor1,$rowColor2);
}
@@ -807,12 +847,12 @@ function changeSort(caller) {
sub retrieve_settings {
my ($cdom,$cnum,$groupname) = @_;
- my %curr_groups = &Apache::loncommon::coursegroups($cdom,$cnum,$groupname);
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname);
return if (!%curr_groups);
my %groupinfo =
- &Apache::loncommon::get_group_settings($curr_groups{$groupname});
+ &Apache::longroup::get_group_settings($curr_groups{$groupname});
my %stored;
@@ -849,12 +889,14 @@ sub retrieve_settings {
$stored{'autodrop'} = $groupinfo{'autodrop'};
if (exists($groupinfo{'autosec'})) {
foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) {
- foreach my $section (@{$groupinfo{'autosec'}{$role}}) {
- push (@{$stored{'sec_'.$role}},$section);
- }
- if (@{$groupinfo{'autosec'}{$role}} > 0) {
- push(@{$stored{'autorole'}},$role);
- }
+ if (ref($groupinfo{'autosec'}{$role}) eq 'ARRAY') {
+ foreach my $section (@{$groupinfo{'autosec'}{$role}}) {
+ push (@{$stored{'sec_'.$role}},$section);
+ }
+ if (@{$groupinfo{'autosec'}{$role}} > 0) {
+ push(@{$stored{'autorole'}},$role);
+ }
+ }
}
}
return %stored;
@@ -897,7 +939,7 @@ sub display_control {
my $groupname = $env{'form.groupname'};
if ($state eq 'pick_group') {
&display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
- $view_permission,$manage_permission,$action,
+ $view_permission,$manage_permission,$action,$state,
$rowColor1,$rowColor2);
} elsif ($state eq 'pick_task') {
&modify_menu($r,$groupname,$page);
@@ -1201,7 +1243,8 @@ sub membership_options {
'meof' => 'members of the new 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',
+ 'create the group, do not make any selections.',
+ 'asub' => 'A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified role and section changes.',
'acty' => 'Access types',
'coro' => 'Course roles',
'cose' => 'Course sections',
@@ -1223,7 +1266,7 @@ sub membership_options {
'.$lt{'gmem'}.' '.$lt{'picr'});
if ($action eq 'create') {
- $r->print($lt{'meof'}.' '.$lt{'ifno'});
+ $r->print($lt{'meof'}.' '.$lt{'ifno'}.' '.$lt{'asub'});
} else {
$r->print($lt{'admg'});
}
@@ -1247,8 +1290,8 @@ sub membership_options {
$r->print(&Apache::lonhtmlcommon::role_select_row(\@roles));
if (@sections > 0) {
@sections = sort {$a cmp $b} @sections;
- unshift(@sections,'_all'); # Put 'all' at the front of the list
- unshift(@sections,'_nosec'); # Put 'no sections' next
+ unshift(@sections,'all'); # Put 'all' at the front of the list
+ unshift(@sections,'none'); # Put 'no sections' next
$r->print('
');
@@ -1269,9 +1312,9 @@ sub sections_selection {
$numvisible = @{$sections};
}
foreach my $sec (@{$sections}) {
- if ($sec eq '_all') {
+ if ($sec eq 'all') {
$section_sel .= ' all sections'."\n";
- } elsif ($sec eq '_nosec') {
+ } elsif ($sec eq 'none') {
$section_sel .= ' no section'."\n";
} else {
$section_sel .= ' '.$sec."\n";
@@ -2588,7 +2631,9 @@ sub member_privileges_form {
}
$specificity = $env{'form.specificity'};
} else {
- @defprivs = @{$$stored{'defpriv'}};
+ if (defined($$stored{'defpriv'})) {
+ @defprivs = @{$$stored{'defpriv'}};
+ }
$specificity = $$stored{'specificity'};
}
my @showtools;
@@ -2772,7 +2817,9 @@ sub process_request {
@defprivs = @temp;
}
} else {
- @defprivs = @{$$stored{'defpriv'}};
+ if (defined($$stored{'defpriv'})) {
+ @defprivs = @{$$stored{'defpriv'}};
+ }
}
my $outcome;
@@ -2852,9 +2899,6 @@ sub write_group_data {
if (defined($env{'form.sec_'.$role})) {
my @autosections=&Apache::loncommon::get_env_multiple('form.sec_'.
$role);
- if (grep/^_all$/,@autosections) {
- @autosections = sort {$a cmp $b} keys(%{$sectioncount});
- }
$autosec .= '';
foreach my $sec (@autosections) {
$autosec .= ''.$sec.'';
@@ -2898,6 +2942,9 @@ sub process_membership {
my $num_ok = 0;
my $num_fail = 0;
my %group_privs = ();
+ my %curr_privs = ();
+ my %curr_start = ();
+ my %curr_end = ();
my %tooltype = ();
foreach my $tool (@{$tools}) {
@@ -2936,6 +2983,7 @@ sub process_membership {
my @expire = ();
my @deletion = ();
my @reenable = ();
+ my @unchanged = ();
if ($state eq 'memresult') {
if (ref($$memchg{'activate'}) eq 'ARRAY') {
@activate = @{$$memchg{'activate'}};
@@ -2949,21 +2997,25 @@ sub process_membership {
if (ref($$memchg{'reenable'}) eq 'ARRAY') {
@reenable = @{$$memchg{'reenable'}};
}
+ my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
+ $groupname);
+ foreach my $key (sort(keys(%membership))) {
+ if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
+ ($curr_end{$1},$curr_start{$1},$curr_privs{$1}) =
+ split(/:/,$membership{$key},3);
+ }
+ }
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;
+ my $savestart = $curr_start{$user};
+ if ($savestart > $now) {
+ $savestart = $now;
}
- $usersettings{$groupname.':'.$user} = $now.':'.$currstart.':'.
- $group_privs{$user};
+ $usersettings{$groupname.':'.$user} = $now.':'.$savestart.':'.
+ $curr_privs{$user};
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
- $user,$now,$currstart,
- $group_privs{$user}) eq 'ok') {
+ $user,$now,$savestart,
+ $curr_privs{$user}) eq 'ok') {
push(@{$added{'expired'}},$user);
$num_ok ++;
} else {
@@ -2987,19 +3039,35 @@ sub process_membership {
}
foreach my $user (sort(keys(%{$usertools}))) {
+ if ((grep(/^$user$/,@expire)) || (grep(/^$user$/,@deletion))) {
+ next;
+ }
my $type;
my $start = $startdate;
my $end = $enddate;
if ($state eq 'memresult') {
+ if ($curr_privs{$user} eq $group_privs{$user}) {
+ push(@unchanged,$user);
+ next;
+ }
+ if (exists($curr_start{$user})) {
+ $start = $curr_start{$user};
+ }
+ if (exists($curr_end{$user})) {
+ $end = $curr_end{$user};
+ }
$type = 'modified';
if (@activate > 0) {
if (grep/^$user$/,@activate) {
$start = $now;
+ $end = $enddate;
$type = 'activated';
}
}
if (@reenable > 0) {
if (grep/^$user$/,@reenable) {
+ $start = $startdate;
+ $end = $enddate;
$type = 'reenabled';
}
}
@@ -3023,7 +3091,7 @@ sub process_membership {
if ($num_ok) {
foreach my $type (sort(keys(%added))) {
$r->print(&mt('The following users were successfully [_1]',$type));
- if (!($type eq 'deleted' || $type eq 'expired')) {
+ if (!($type eq 'deleted' || $type eq 'expired')) {
$r->print(&mt(' with the following privileges'));
}
$r->print(': ');
@@ -3044,6 +3112,7 @@ sub process_membership {
}
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.$privlist.' ');
}
+ $r->print(' ');
}
}
if ($num_fail) {
@@ -3053,11 +3122,19 @@ sub process_membership {
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.' ');
}
}
+ $r->print(' ');
+ }
+ if (@unchanged > 0) {
+ $r->print(&mt('No change occurred for the following users: '));
+ foreach my $user (sort(@unchanged)) {
+ $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.' ');
+ }
+ $r->print(' ');
}
if ($roster_result eq 'ok') {
- $r->print(' Group membership list updated.');
+ $r->print(' '.&mt('Group membership list updated.'));
} else {
- $r->print(' An error occurred while updating the group membership list -'.$roster_result.' ');
+ $r->print(' '.&mt('An error occurred while updating the group membership list -').$roster_result.' ');
}
return;
}
@@ -3115,7 +3192,7 @@ sub automapping {
'.$$lt{'auad'}.':
- on off');
+ ');
if ($action eq 'modify') {
$r->print(' ('.$$lt{'curr'}.' '.$$lt{$add}.')');
}
@@ -3127,7 +3204,7 @@ sub automapping {
'.$$lt{'auex'}.':
- on off');
+ ');
if ($action eq 'modify') {
$r->print(' ('.$$lt{'curr'}.' '.$$lt{$drop}.')');
}
@@ -3150,8 +3227,8 @@ sub mapping_settings {
my @sections = keys(%{$sectioncount});
if (@sections > 0) {
@sections = sort {$a cmp $b} @sections;
- unshift(@sections,'_nosec'); # Put 'no sections' next
- unshift(@sections,'_all'); # Put 'all' at the front of the list
+ unshift(@sections,'none'); # Put 'no sections' next
+ unshift(@sections,'all'); # Put 'all' at the front of the list
}
&topic_bar($r,$tabcol,$image,$$lt{'pirs'});
$r->print('
@@ -3175,8 +3252,15 @@ sub mapping_settings {
my $plrole=&Apache::lonnet::plaintext($role);
my $sections_sel;
if (@sections > 0) {
- $sections_sel='