--- loncom/interface/loncoursegroups.pm 2006/05/18 18:35:13 1.19 +++ loncom/interface/loncoursegroups.pm 2006/05/25 22:39:59 1.22 @@ -83,10 +83,16 @@ sub handler { my $rowColor2 = "#eeeeee"; my $action = $env{'form.action'}; + my $state = $env{'form.state'}; + if ((!defined($action)) || ($action eq 'view')) { + if (!defined($state)) { + $state = 'view'; + } + } if ($action eq 'create' || $action eq 'modify' || $action eq 'view') { if ($view_permission || $manage_permission) { - &group_administration($r,$action,$cdom,$cnum,$function,$tabcol, - \%functions,\%idx,$view_permission, + &group_administration($r,$action,$state,$cdom,$cnum,$function, + $tabcol,\%functions,\%idx,$view_permission, $manage_permission,$rowColor1,$rowColor2); } else { $r->print(&mt('You do not have group administration '. @@ -94,7 +100,7 @@ sub handler { } } else { &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx, - $view_permission,$manage_permission,$action, + $view_permission,$manage_permission,$action,$state, $rowColor1,$rowColor2); } return OK; @@ -102,31 +108,36 @@ sub handler { sub print_main_menu { my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$rowColor1,$rowColor2) = @_; - $r->print(&header('Course Groups',undef,undef,undef,undef,$function)); + $manage_permission,$action,$state,$rowColor1,$rowColor2) = @_; + my $jscript = qq| +function changeSort(caller) { + document.$state.sortby.value = caller; + document.$state.submit(); +}\n|; + $r->print(&header('Course Groups',$jscript,$action,$state, + undef,$function)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursegroups", text=>"Course Groups",}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Groups')); &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action,$rowColor1, - $rowColor2); + $view_permission,$manage_permission,$action,$state, + $rowColor1,$rowColor2); $r->print(&footer()); return; } sub display_groups { my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$rowColor1,$rowColor2) = @_; + $manage_permission,$action,$state,$rowColor1,$rowColor2) = @_; my %curr_groups = (); my %grp_info = (); - my %actionlinks = ( - modify => '$lt{'func'} $lt{'quot'} - $lt{'memb'} + $lt{'memb'} $lt{'file'} $lt{'dibd'} $lt{'dius'} @@ -248,13 +259,29 @@ END } else { $link .= $group.'/grppg'; } - $link .= '">'.$lt{$action}.''; + $link .= '">'.$lt{$action}.''; + if ($action eq 'view') { + if (($manage_permission) && + ($env{'form.refpage'} ne 'enrl')) { + $link .= '  '.$actionlinks{'modify'}. + $group.'">'.$lt{'modify'}.''; + } + } $r->print(''.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.$totalfiles.''.$boards.''.$diskuse.''); $rowNum ++; } } $r->print(''); $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(''); + if ($action eq 'view') { + if (!defined($state)) { + $state = 'view'; + } + $r->print(''); + } } else { $r->print($lt{'nogr'}); if ($manage_permission) { @@ -288,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 = (); @@ -303,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'})) { @@ -342,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') { @@ -367,71 +397,90 @@ sub group_administration { } } - my %toolprivs = (); - %{$toolprivs{'email'}} = ( - sgm => 'Send group mail', - sgb => 'Broadcast mail', - ); - %{$toolprivs{'discussion'}} = ( - cgb => 'Create boards', - pgd => 'Post', - pag => 'Anon. posts', - rgi => 'Get identities', - vgb => 'View boards', - ); - %{$toolprivs{'chat'}} = ( - pgc => 'Chat', - ); - %{$toolprivs{'files'}} = ( - rgf => 'Retrieve', - ugf => 'Upload', - dgf => 'Delete', - ); - %{$toolprivs{'roster'}} = ( - vgm => 'View', - ); - %{$toolprivs{'homepage'}} = ( - vgh => 'View page', - mgh => 'Modify page', - ); - my %fixedprivs = (); - %{$fixedprivs{'email'}} = ('sgm' => 1); - %{$fixedprivs{'discussion'}} = ('vgb' => 1); - %{$fixedprivs{'chat'}} = ('pgc' => 1); - %{$fixedprivs{'files'}} = ('rgf' => 1); - %{$fixedprivs{'roster'}} = ('vgm' => 1); - %{$fixedprivs{'homepage'}} = ('vgh' => 1); - - my %elements = (); - %{$elements{'create'}} = (); - %{$elements{'modify'}} = (); - %{$elements{'create'}{'pick_name'}} = ( - startdate_month => 'selectbox', - startdate_hour => 'selectbox', - enddate_month => 'selectbox', - enddate_hour => 'selectbox', - startdate_day => 'text', - startdate_year => 'text', - startdate_minute => 'text', - startdate_second => 'text', - enddate_day => 'text', - enddate_year => 'text', - enddate_minute => 'text', - enddate_second => 'text', - groupname => 'text', - description => 'text', - tool => 'checkbox', - granularity => 'radio', - no_end_date => 'checkbox', - ); - %{$elements{'modify'}{'change_settings'}} = ( - %{$elements{'create'}{'pick_name'}}, - specificity => 'radio', - defpriv => 'checkbox', - autorole => 'checkbox', - autoadd => 'radio', - autodrop => 'radio', - ); + my %toolprivs = + ( + email => { + sgm => 'Send group mail', + sgb => 'Broadcast mail', + }, + discussion => { + cgb => 'Create boards', + pgd => 'Post', + pag => 'Anon. posts', + rgi => 'Get identities', + vgb => 'View boards', + }, + chat => { + pgc => 'Chat', + }, + files => { + rgf => 'Retrieve', + ugf => 'Upload', + dgf => 'Delete', + }, + roster => { + vgm => 'View', + }, + homepage => { + vgh => 'View page', + mgh => 'Modify page', + }, + ); + + my %fixedprivs = + ( + email => {sgm => 1}, + discussion => {vgb => 1}, + chat => {pgc => 1}, + files => {rgf => 1}, + roster => {vgm => 1}, + homepage => {vgh => 1}, + ); + + my %elements = + ( + create => { + pick_name => { + startdate_month => 'selectbox', + startdate_hour => 'selectbox', + enddate_month => 'selectbox', + enddate_hour => 'selectbox', + startdate_day => 'text', + startdate_year => 'text', + startdate_minute => 'text', + startdate_second => 'text', + enddate_day => 'text', + enddate_year => 'text', + enddate_minute => 'text', + enddate_second => 'text', + groupname => 'text', + description => 'text', + tool => 'checkbox', + granularity => 'radio', + no_end_date => 'checkbox', + }, + pick_members => { + member => 'checkbox', + defpriv => 'checkbox', + }, + }, + ); + + $elements{'modify'} = { + change_settings => { + %{$elements{'create'}{'pick_name'}}, + specificity => 'radio', + defpriv => 'checkbox', + autorole => 'checkbox', + autoadd => 'radio', + autodrop => 'radio', + }, + add_members => { + types => 'selectbox', + roles => 'selectbox', + }, + }; + if (ref($stored{'autorole'}) eq 'ARRAY') { foreach my $role (@{$stored{'autorole'}}) { unless ($role eq 'cc') { @@ -440,15 +489,6 @@ sub group_administration { } } } - %{$elements{'create'}{'pick_members'}} = ( - member => 'checkbox', - defpriv => 'checkbox', - ); - - %{$elements{'modify'}{'add_members'}} = ( - types => 'selectbox', - roles => 'selectbox', - ); if (($action eq 'create') && ($state eq 'pick_name')) { $elements{'create'}{'pick_name'}{'types'} = 'selectbox'; @@ -476,7 +516,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); } } @@ -560,11 +600,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; } @@ -705,7 +751,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'}}}); } @@ -801,7 +847,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); } @@ -903,7 +949,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); @@ -1207,7 +1253,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', @@ -1229,7 +1276,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'}); } @@ -2077,11 +2124,14 @@ sub current_membership { my($end,$start,@userprivs) = split(/:/,$membership{$key}); unless ($start == -1) { $allnames{$udom}{$uname} = 1; - %{$current{$user}} = (); - $current{$user}{uname} = $uname; - $current{$user}{udom} = $udom; - $current{$user}{start} = - &Apache::lonlocal::locallocaltime($start); + $current{$user} = { + uname => $uname, + udom => $udom, + start => &Apache::lonlocal::locallocaltime($start), + currtools => []; + newtools => []; + }; + if ($end == 0) { $current{$user}{end} = 'No end date'; } else { @@ -2099,8 +2149,6 @@ sub current_membership { $current{$user}{changestate} = 'expire'; $num_expire ++; } - @{$current{$user}{currtools}} = (); - @{$current{$user}{newtools}} = (); if (@userprivs > 0) { foreach my $tool (sort(keys(%{$fixedprivs}))) { foreach my $priv (keys(%{$$fixedprivs{$tool}})) { @@ -2905,6 +2953,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}) { @@ -2943,6 +2994,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'}}; @@ -2956,21 +3008,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 { @@ -2994,19 +3050,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'; } } @@ -3030,7 +3102,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(':
'); @@ -3051,6 +3123,7 @@ sub process_membership { } $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.$privlist.'
'); } + $r->print('
'); } } if ($num_fail) { @@ -3060,6 +3133,14 @@ 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('
'.&mt('Group membership list updated.'));