--- loncom/interface/loncoursegroups.pm 2006/05/18 18:35:13 1.19
+++ loncom/interface/loncoursegroups.pm 2006/06/23 00:22:58 1.25
@@ -1,3 +1,6 @@
+# The LearningOnline Network with CAPA
+#
+# $Id: loncoursegroups.pm,v 1.25 2006/06/23 00:22:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -32,6 +35,8 @@ use Apache::lonlocal;
use Apache::lonnavmaps;
use Apache::longroup;
use Apache::Constants qw(:common :http);
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
sub handler {
my ($r) = @_;
@@ -83,10 +88,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 +105,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 +113,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 => ' ' 'Modify',
@@ -174,7 +190,7 @@ sub display_groups {
$lt{'func'}
|
$lt{'quot'} |
- $lt{'memb'} |
+ $lt{'memb'} |
$lt{'file'} |
$lt{'dibd'} |
$lt{'dius'} |
@@ -224,7 +240,7 @@ END
$rowColor = $rowColor2;
}
my $description =
- &Apache::lonnet::unescape($grp_info{$group}{'description'});
+ &unescape($grp_info{$group}{'description'});
my $creator = $grp_info{$group}{'creator'};
my $creation = $grp_info{$group}{'creation'};
my $modified = $grp_info{$group}{'modified'};
@@ -248,13 +264,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) {
@@ -273,7 +305,7 @@ END
foreach my $group (@coursegroups) {
my %group_info = &Apache::longroup::get_group_settings(
$curr_groups{$group});
- my $description = &Apache::lonnet::unescape(
+ my $description = &unescape(
$group_info{description});
my ($uname,$udom) = split(/:/,$group_info{creator});
$r->print(''.$group,'
'.$description.'
');
@@ -288,7 +320,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 +335,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 +373,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 +402,92 @@ 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',
+ mgf => 'Modify',
+ dgf => 'Delete',
+ agf => 'Control Access',
+ },
+ 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 +496,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 +523,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 +607,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 +758,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 +854,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);
}
@@ -821,7 +874,7 @@ sub retrieve_settings {
my %stored;
$stored{'description'} =
- &Apache::lonnet::unescape($groupinfo{'description'});
+ &unescape($groupinfo{'description'});
$stored{'startdate'} = $groupinfo{'startdate'};
$stored{'enddate'} = $groupinfo{'enddate'};
if ($stored{'enddate'} == 0) {
@@ -903,7 +956,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 +1260,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 +1283,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 +2131,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 +2156,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}})) {
@@ -2813,7 +2868,7 @@ sub write_group_data {
$creation = $$stored{'creation'};
$creator = $$stored{'creator'};
}
- my $esc_description = &Apache::lonnet::escape($description);
+ my $esc_description = &escape($description);
my @single_attributes = ('description','functions','startdate','enddate',
'creation','modified','creator','granularity',
'specificity','autoadd','autodrop');
@@ -2905,6 +2960,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 +3001,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 +3015,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 +3057,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 +3109,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 +3130,7 @@ sub process_membership {
}
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.$privlist.' ');
}
+ $r->print(' ');
}
}
if ($num_fail) {
@@ -3060,6 +3140,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.'));
@@ -3369,7 +3457,7 @@ sub date_setting_table {
sub create_homepage {
my ($cdom,$cnum,$name,$groupinfo,$tools) = @_;
my $functionality = join(',',@{$tools});
- my $content = &Apache::lonnet::unescape($$groupinfo{description});
+ my $content = &unescape($$groupinfo{description});
$content=~s/\s+$//s;
$content=~s/^\s+//s;
$content=~s/\ $//s;
|