');
}
}
} else {
- $r->print(&mt('You are not currently a member of any '.
- 'active [_1]s in this [_2]',$gpterm,
- lc($crstype)));
+ $r->print(&mt('You are not currently a member of any active '.$gpterm.'s in this '.lc($crstype).'.'));
}
}
return;
@@ -401,11 +460,9 @@ sub group_administration {
if ($state eq '') {
if (defined($env{'form.groupname'})) {
$state = 'pick_task';
- } else {
- $state = 'pick_group';
}
} else {
- %stored = &retrieve_settings($cdom,$cnum,$groupname);
+ %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
if (ref($stored{'types'}) eq 'ARRAY') {
@types = @{$stored{'types'}};
}
@@ -496,11 +553,9 @@ sub group_administration {
(($action eq 'modify') && (($state eq 'change_settings') ||
($state eq 'add_members')))) {
%sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
- if (%sectioncount) {
- $elements{'create'}{'pick_name'}{'sectionpick'} = 'selectbox';
- $elements{'modify'}{'change_mapping'}{'sectionpick'} = 'selectbox';
- $elements{'modify'}{'add_members'}{'sectionpick'} = 'selectbox';
- }
+ $elements{'create'}{'pick_name'}{'sectionpick'} = 'selectbox';
+ $elements{'modify'}{'change_mapping'}{'sectionpick'} = 'selectbox';
+ $elements{'modify'}{'add_members'}{'sectionpick'} = 'selectbox';
}
if (($action eq 'create') ||
@@ -513,9 +568,6 @@ sub group_administration {
}
if (defined($env{'form.sectionpick'})) {
@sections=&Apache::loncommon::get_env_multiple('form.sectionpick');
- if (grep/^all$/,@sections) {
- @sections = sort {$a cmp $b} keys(%sectioncount);
- }
}
}
@@ -556,7 +608,7 @@ sub group_administration {
$num_reenable ++;
next;
} elsif (($start > $now)) {
- $num_activate = 1;
+ $num_activate ++;
next;
} else {
$num_expire ++;
@@ -725,13 +777,13 @@ sub group_administration {
my $space_trim = '/^\s*|\s*\$/g,""';
my $float_check = '/^([0-9]*\.?[0-9]*)$/';
$validate_script = '
- var newquota = document.'.$state.'.quota.value;
+ var newquota = new String(document.'.$state.'.quota.value);
newquota.replace('.$space_trim.');
if (newquota == "" ) {
document.'.$state.'.quota.value = 0;
- newquota = 0;
+ newquota = "0";
}
- var maxposs = '.$maxposs.';
+ var maxposs = '.sprintf("%.2f",$maxposs).';
if (newquota > maxposs) {
alert("The file repository quota you entered for this group ("+newquota+" Mb) exceeds the maximum possible ("+maxposs+" Mb). Please enter a smaller number.");
return;
@@ -782,7 +834,9 @@ function changeSort(caller) {
my %states = ();
my %branchstates = ();
@{$states{'create'}} = ('pick_name','pick_members','pick_privs','result');
- @{$states{'modify'}} = ('pick_group','pick_task');
+ @{$states{'modify'}} = ('pick_task');
+ @{$states{'delete'}} = ('verify','result');
+ @{$states{'reenable'}} = ('verify','result');
@{$branchstates{'noprivs'}} = ('result');
@{$branchstates{'settings'}} = ('change_settings','chgresult');
@{$branchstates{'members'}} = ('change_members','change_privs','memresult');
@@ -793,7 +847,7 @@ function changeSort(caller) {
push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}});
}
- if (($action eq 'create') || ($action eq 'modify')) {
+ if (($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) {
my $done = 0;
my $i=0;
while ($i<@{$states{$action}} && !$done) {
@@ -806,20 +860,30 @@ function changeSort(caller) {
}
my $loaditems = &onload_action($action,$state);
- my $crumbtitle = "$crstype $ucgpterm".'s';
- $r->print(&header("$crumbtitle Manager",
+ $r->print(&header("Groups Manager",
$jscript,$action,$state,$page,$loaditems));
- if ($env{'form.refpage'} eq 'enrl') {
+ if ($env{'form.refpage'} eq 'cusr') {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>"/adm/dropadd",
- text=>"Enrollment Manager",
+ ({href=>"/adm/createuser",
+ text=>"User Management",
faq=>9,bug=>'Instructor Interface',});
- } else {
+ if ($action eq 'modify' || $action eq 'delete') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursegroups?refpage=cusr&action=$action",
+ text=>"Groups",
+ faq=>9,bug=>'Instructor Interface',});
+ }
+ } else {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>"/adm/coursegroups",
- text=>"$crumbtitle",
- faq=>9,bug=>'Instructor Interface',});
+ ({href=>"/adm/coursegroups",
+ text=>"Groups",
+ faq=>9,bug=>'Instructor Interface',});
+ if ($env{'form.refpage'} eq 'grouplist') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/$cdom/$cnum/$env{'form.groupname'}/smppg?ref=grouplist",
+ text=>"Group: $description",});
+ }
}
my %trail = ();
@@ -830,7 +894,6 @@ function changeSort(caller) {
result => 'Creation Complete',
);
%{$trail{'modify'}} = &Apache::lonlocal::texthash(
- pick_group => $ucgpterm.'s',
pick_task => 'Choose Task',
change_settings => "$ucgpterm Settings",
change_members => 'Modify/Delete Members',
@@ -843,6 +906,14 @@ function changeSort(caller) {
memresult => 'Modifications Complete',
addresult => 'Additions Complete',
);
+ %{$trail{'delete'}} = &Apache::lonlocal::texthash(
+ verify => 'Verify deletion',
+ result => 'Deletion Complete'
+ );
+ %{$trail{'reenable'}} = &Apache::lonlocal::texthash(
+ verify => 'Verify Re-enable',
+ result => 'Re-enabled'
+ );
my %navbuttons = &Apache::lonlocal::texthash(
gtns => 'Go to next step',
gtps => 'Go to previous step',
@@ -851,14 +922,14 @@ function changeSort(caller) {
gtpp => 'Go to previous page',
adme => 'Add members',
);
- if ((($action eq 'create') || ($action eq 'modify')) &&
+ if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) &&
($manage_permission)) {
for (my $i=0; $i<@{$states{$action}}; $i++) {
if ($state eq $states{$action}[$i]) {
&Apache::lonhtmlcommon::add_breadcrumb(
{text=>"$trail{$action}{$state}"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs
- ("$crumbtitle Manager"));
+ ("Groups Manager","Creating_Groups"));
&display_control($r,$cdom,$cnum,$action,$state,$page,
\%sectioncount,$groupname,$description,$functions,
\@tools,$toolprivs,$fixedprivs,$startdate,$enddate,
@@ -869,35 +940,43 @@ function changeSort(caller) {
$crstype);
last;
} else {
- if (($state eq 'result') && ($i > 0)) {
- &Apache::lonhtmlcommon::add_breadcrumb(
+ if (($action eq 'create') || ($action eq 'modify')) {
+ if (($state eq 'result') && ($i > 0)) {
+ &Apache::lonhtmlcommon::add_breadcrumb(
{href=>"javascript:backPage(document.$state,'$states{$action}[0]')",
text=>"$trail{$action}{$states{$action}[$i]}"});
- } else {
- &Apache::lonhtmlcommon::add_breadcrumb(
+ } else {
+ &Apache::lonhtmlcommon::add_breadcrumb(
{href=>"javascript:backPage(document.$state,'$states{$action}[$i]')",
text=>"$trail{$action}{$states{$action}[$i]}"});
+ }
}
- }
+ }
}
} elsif (($action eq 'view') && ($view_permission)) {
&Apache::lonhtmlcommon::add_breadcrumb(
{text=>"View $gpterm".'s'});
- my $crumbtitle = "$crstype $ucgpterm".'s Manager';
$r->print(&Apache::lonhtmlcommon::breadcrumbs
- (&mt($crumbtitle)));
+ ('Groups Manager'));
&display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
$manage_permission,$action,$state,$gpterm,$ucgpterm,
$crstype);
-
}
$r->print(&footer());
return;
}
sub retrieve_settings {
- my ($cdom,$cnum,$groupname) = @_;
- my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname);
+ my ($cdom,$cnum,$groupname,$action) = @_;
+ 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);
@@ -942,6 +1021,7 @@ sub retrieve_settings {
foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) {
if (ref($groupinfo{'autosec'}{$role}) eq 'ARRAY') {
foreach my $section (@{$groupinfo{'autosec'}{$role}}) {
+
push (@{$stored{'sec_'.$role}},$section);
}
if (@{$groupinfo{'autosec'}{$role}} > 0) {
@@ -989,11 +1069,7 @@ sub display_control {
}
} elsif ($action eq 'modify') {
my $groupname = $env{'form.groupname'};
- if ($state eq 'pick_group') {
- &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
- $manage_permission,$action,$state,$gpterm,
- $ucgpterm,$crstype);
- } elsif ($state eq 'pick_task') {
+ if ($state eq 'pick_task') {
&modify_menu($r,$groupname,$page,$gpterm);
} elsif ($state eq 'change_settings') {
&general_settings_form($r,$cdom,$cnum,$action,$state,$page,
@@ -1007,7 +1083,7 @@ sub display_control {
$userdata,$granularity,$quota,$specificity,
$idx,$states,$navbuttons,$gpterm,$ucgpterm);
} elsif ($state eq 'add_members') {
- &add_members_form($r,$action,$state,$page,$startdate,
+ &add_members_form($r,$cdom,$cnum,$action,$state,$page,$startdate,
$enddate,$groupname,$description,$granularity,
$quota,$sectioncount,$tools,$functions,$stored,
$states,$navbuttons,$gpterm,$ucgpterm);
@@ -1039,9 +1115,316 @@ sub display_control {
$sections,$states,$navbuttons,$memchg,
$sectioncount,$stored,$gpterm,$ucgpterm,$crstype);
}
+ } elsif ($action eq 'delete') {
+ my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
+ if ($state eq 'verify') {
+ &verify_delete($r,$groupname,$state,$action,$page,$states,
+ \%stored);
+ } elsif ($state eq 'result') {
+ &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);
+ }
}
}
+sub verify_delete {
+ my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;
+ $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
+ $r->print(&mt('You have requested deletion of the group [_1].'
+ ,''.$stored->{'description'}.'').
+ '
'.&mt('When a group is deleted the following occurs:').'
'.
+ '
'.&mt('All group membership is terminated.').'
'.
+ '
'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'
'.
+ '
'.&mt('The group folder is removed from the folder containing it - normally this is the "Course Groups" folder which contains folders for all groups in the course.').'
'.
+ '
'.&mt('Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same course in the future.'));
+ my $prevtext = &mt('Go back');
+ my $nexttext = &mt('Delete group');
+ my $prev;
+ if ($env{'form.refpage'} eq 'cusr') {
+ $prev = 'view';
+ }
+ &display_navbuttons($r,$formname,$prev,$prevtext,
+ $$states{$action}[$page+1],$nexttext);
+ return;
+}
+
+sub delete_group {
+ my ($r,$cdom,$cnum,$groupname) = @_;
+ my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
+ $groupname);
+ my $now = time;
+ my $num_users = 0;
+ my $num_fail = 0;
+ my $num_ok = 0;
+ my @deleted;
+ my @undeleted;
+ my %usersettings;
+ my $context = 'deletegroup';
+ 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) {
+ $num_users ++;
+ $usersettings{$groupname.':'.$user} = $now.':-1:'.$userprivs;
+ if (&Apache::lonnet::modify_group_roles($cdom,$cnum,
+ $groupname,$user,
+ $now,'-1',$userprivs,
+ '',$context)
+ eq 'ok') {
+ $num_ok ++;
+ push(@deleted,$user);
+ } else {
+ push(@undeleted,$user);
+ $num_fail ++;
+ }
+ }
+ }
+ }
+ if ($num_ok > 0) {
+ my $roster_result =
+ &Apache::lonnet::modify_coursegroup_membership($cdom,$cnum,
+ \%usersettings);
+ }
+ if ($num_fail > 0) {
+ $r->print('
'
+ .&mt('Group deletion failed because deletion of [_1] out of [_2] members failed.'
+ ,$num_fail,$num_users)
+ .'
');
+
+ } else {
+ my ($result,$message) =
+ &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum,
+ $groupname,'delete');
+ if ($result eq 'ok') {
+ my $outcome = &modify_folders($cdom,$cnum,$groupname);
+ if ($outcome eq '') {
+ $r->print('
'
+ .&mt('Group successfully deleted.')
+ .'
');
+ } else {
+ $r->print('
'
+ .&mt("Although the group was deleted, an error occurred when removing"
+ ." the group's folder from the 'Course Groups' folder: [_1]",$outcome)
+ .'
');
+ }
+ } else {
+ $r->print('
'
+ .&mt('Group deletion failed.')
+ .'
');
+ }
+ }
+ 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 -[_1]',$description);
+ my $mapurl = $crspath.'group_folder_'.
+ $groupname.'.sequence';
+ my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap);
+ if ($fatal) {
+ $outcome='
'
+ .&mt('An error occurred when reading contents of parent folder to group:')
+ ." ($allgrpsmap): $errtext"
+ .'
';
+ } 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('An error occurred when saving updated parent folder to group:'
+ ," $allgrpsmap - $errtext")
+ .'
';
+ } else {
+ my ($furl,$ferr) =
+ &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+ }
+ }
+ return $outcome;
+}
+
+sub modify_folders {
+ my ($cdom,$cnum,$groupname) = @_;
+ my $outcome;
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'.
+ $groupname.'.sequence';
+ my $groupmapres = $navmap->getResourceByUrl($groupmap);
+ my ($map,$id,$src);
+ if ($groupmapres) {
+ ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb());
+ }
+ undef($navmap);
+ if ($map) {
+ $map = '/'.$map;
+ my ($errtext,$fatal) = &LONCAPA::map::mapread($map);
+ if ($fatal) {
+ $outcome='
'
+ .&mt('An error occurred when reading contents of parent folder to group:')
+ ." ($map): $errtext"
+ .'
';
+ } else {
+ my $idx = 0;
+ my $grpidx;
+ foreach my $item (@LONCAPA::map::order) {
+ my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$item]);
+ $url=&LONCAPA::map::qtescape($url);
+ if ($url eq $groupmap) {
+ $grpidx = $idx;
+ last;
+ } else {
+ $idx++;
+ }
+ }
+
+ if ($grpidx ne '') {
+ &LONCAPA::map::makezombie($LONCAPA::map::order[$grpidx]);
+ for (my $i=$grpidx;$i<$#LONCAPA::map::order;$i++) {
+ $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
+ }
+ $#LONCAPA::map::order--;
+ my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1);
+ if ($errtext) {
+ $outcome='
'
+ .&mt('An error occurred when saving updated parent folder to group:')
+ ." $map - $errtext"
+ .'
';
+ } else {
+ my ($furl,$ferr) =
+ &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+ }
+ }
+ }
+ }
+ 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 previously deleted group [_1].'
+ ,''.$stored->{'description'}.'').
+ '
'.&mt('When a deleted group is re-enabled the following occurs:').'
'.
+ '
'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'
'.
+ '
'.&mt('A group folder is added to the "Course Groups" folder which contains folders for all groups in the course.').'
');
+ my $prevtext = &mt('Go back');
+ my $nexttext = &mt('Reenable group');
+ my $prev;
+ if ($env{'form.refpage'} eq 'cusr') {
+ $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');
+ if (keys(%groups) == 0) {
+ $r->print(&mt('The group [_1] was not re-enabled, because it is not a deleted group.[_2]Perhaps it has already been re-enabled?',''.$groupname.''),' ');
+ return;
+ }
+ 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 $context = 'reenablegroup';
+ 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,'',
+$context) 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 [quant,_1,user], each with start and end dates for group access set to defaults: [_2] and [_3]',$num_ok,$showstart,$showend)
+ .'
');
+ }
+ } 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)
+ .'
');
+ }
+ } else {
+ $r->print('
'
+ .&mt('There were no group members to reinstate, as none were removed when the group was deleted.')
+ .'
');
+ }
+ 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 occurred when adding the group's folder to the 'Course Groups' folder: [_1]",$outcome)
+ .'
');
+ }
+ } else {
+ $r->print('
'
+ .&mt('Re-enabling group failed.')
+ .'
');
+ }
+ return;
+}
+
sub header {
my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_;
my $start_page=
@@ -1078,8 +1461,7 @@ sub onload_action {
}
if (($action eq 'modify') &&
($state eq 'change_settings' || $state eq 'change_members' ||
- $state eq 'change_privs' || $state eq 'add_members' ||
- $state eq 'pick_members')) {
+ $state eq 'change_privs' || $state eq 'add_members')) {
$loaditems{'onload'} =
'javascript:setFormElements(document.'.$state.')';
}
@@ -1110,16 +1492,16 @@ sub build_members_list {
}
sub group_files {
- my ($group,$currdir,$numfiles,$numdirs) = @_;
+ my ($group,$portpath,$numfiles,$numdirs) = @_;
my $dirptr=16384;
- my @dir_list=&Apache::portfolio::get_dir_list($currdir,$group);
+ my @dir_list=&Apache::portfolio::get_dir_list($portpath,undef,$group);
foreach my $line (@dir_list) {
my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);
if (($filename !~ /^\.\.?$/) && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/) && ($filename ne 'no_such_dir')) {
if ($dirptr&$testdir) {
- $currdir .= '/'.$filename;
+ $portpath .= '/'.$filename;
$$numdirs ++;
- &group_files($numfiles,$numdirs)
+ &group_files($group,$portpath,$numfiles,$numdirs)
} else {
$$numfiles ++;
}
@@ -1132,39 +1514,54 @@ sub group_members {
my ($cdom,$cnum,$group,$group_info) = @_;
my %memberhash = &Apache::lonnet::get_group_membership($cdom,$cnum,$group);
my $now = time;
- my ($tmp)=keys(%memberhash);
- if ($tmp=~/^error:/) {
- $$group_info{'totalmembers'} = 'Unknown - an error occurred';
- return $tmp;
- }
+ my %lt = &Apache::lonlocal::texthash (
+ active => 'active',
+ previous => 'previous',
+ future => 'future',
+ );
+ my %membercounts = (
+ active => 0,
+ previous => 0,
+ future => 0,
+ );
my $totalmembers = 0;
- my $active = 0;
- my $previous = 0;
- my $future = 0;
foreach my $member (keys %memberhash) {
$totalmembers ++;
my ($end,$start) = split(/:/,$memberhash{$member});
unless ($start == -1) {
if (($end!=0) && ($end<$now)) {
- $previous ++;
+ $membercounts{previous} ++;
} elsif (($start!=0) && ($start>$now)) {
- $future ++;
+ $membercounts{future} ++;
} else {
- $active ++;
+ $membercounts{active} ++;
}
}
}
if ($totalmembers == 0) {
$$group_info{$group}{'totalmembers'} = 'None';
} else {
- $$group_info{$group}{'totalmembers'} = ''.$active.
- ' - active '.$previous.
- ' - previous '.$future.
- ' - future';
+ foreach my $type ('active','previous','future') {
+ $$group_info{$group}{'totalmembers'} .=
+ &open_list_window($group,$type,$membercounts{$type},$lt{$type});
+ }
}
return 'ok';
}
+sub open_list_window {
+ my ($group,$status,$count,$text) = @_;
+ my $entry;
+ if ($count > 0) {
+ $entry = ''.$text.' - '.$count.
+ ' ';
+ } else {
+ $entry = ''.$text.' - '.$count.' ';
+ }
+ return $entry;
+}
+
sub general_settings_form {
my ($r,$cdom,$cnum,$action,$formname,$page,$functions,$tools,
@@ -1175,8 +1572,8 @@ sub general_settings_form {
$gpterm,$ucgpterm,$crstype);
&access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm);
if ($action eq 'create') {
- &membership_options($r,$action,$formname,$sectioncount,3,$gpterm,
- $ucgpterm);
+ &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,3,
+ $gpterm,$ucgpterm);
$nexttext = $$navbuttons{'gtns'};
} else {
my @available = ();
@@ -1188,7 +1585,7 @@ sub general_settings_form {
$gpterm,$ucgpterm);
&mapping_options($r,$action,$formname,$page,$sectioncount,
$states,$stored,$navbuttons,4,5,
- $gpterm,$ucgpterm,$crstype);
+ $gpterm,$ucgpterm,$crstype,$cdom,$cnum);
$nexttext = $$navbuttons{'mose'};
}
$prevtext = $$navbuttons{'gtpp'};
@@ -1201,26 +1598,25 @@ sub groupsettings_options {
my ($r,$functions,$action,$formname,$stored,$image,$gpterm,
$ucgpterm,$crstype) = @_;
my %lt = &Apache::lonlocal::texthash(
- 'gdat' => "$ucgpterm open and close dates",
- 'sten' => "Set a start date/time and end date/time for the $gpterm",
- 'gfun' => "$ucgpterm functionality",
- 'gnde' => "$ucgpterm name, description and available functionality",
- 'desc' => 'Description',
- 'func' => 'Functionality',
- 'gnam' => "$ucgpterm Name",
- 'doyo' => "Do you want to assign different functionality ".
- "to different $gpterm members?",
+ 'gdat' => "Group access start and end dates",
+ 'gnde' => "Group name, title and available collaborative tools",
+ 'desc' => 'Group Title',
+ 'func' => 'Collaborative Tools',
+ 'gnam' => 'Group Name',
+ 'lett' => 'Letters, numbers and underscore only',
+ 'doyo' => 'Different subsets of the chosen collaborative tools '.
+ 'for different group members?',
);
my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored);
- &topic_bar($r,$image,$lt{'gnde'});
- $r->print('
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}).'
');
if ($action eq 'create') {
- $r->print(&mt('If you enable the file repository for the [_1], allocate a disk quota.',$gpterm));
+ $r->print(&mt('If you enable the file repository for the '.$gpterm.', allocate a disk quota.'));
} else {
$r->print(&mt('Quota allocated to file repository:'));
}
- $r->print(' Mb');
+ $r->print(' '.&mt('[_1] Mb',''));
if ($action eq 'create') {
- $r->print(' '.
- &mt('A total of [_1] Mb can be divided amongst all [_2]s in the '.
- '[_3], and [_4] Mb are currently unallocated.',$crsquota,
- $gpterm,lc($crstype),$freespace));
+ $r->print(' '
+ .&mt('A total of [_1] Mb can be divided amongst all '.$gpterm.'s in the '
+ .lc($crstype).', and [_2] Mb are currently unallocated.'
+ ,$crsquota,sprintf("%.2f",$freespace))
+ );
} else {
$r->print(' ('.&mt('The quota is currently [_1] Mb',
$$stored{'quota'}).').');
- $r->print(' '.&mt('The quota can be increased to [_1] Mb, '.
- 'by adding all unallocated space for [_2]s in the [_3].',
- $maxposs,$gpterm,lc($crstype)));
+ $r->print(' '
+ .&mt('The quota can be increased to [_1] Mb, '
+ .'by adding all unallocated space for '.$gpterm.'s in the '.lc($crstype).'.'
+ ,sprintf("%.2f",$maxposs)));
}
$r->print('
@@ -1324,18 +1722,18 @@ sub get_quota_constraints {
}
sub membership_options {
- my ($r,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm) = @_;
+ my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm)=@_;
my $crstype = &Apache::loncommon::course_type();
my %lt = &Apache::lonlocal::texthash(
- 'pipa' => 'Pick parameters to generate membership list',
- 'gmem' => "$ucgpterm membership options",
+ 'pipa' => 'Build a list of users for selection of group members',
+ 'gmem' => "Group membership selection list criteria:",
'picr' => 'Pick the criteria to use to build a list of '.
lc($crstype).' users from which you will select ',
- 'meof' => "members of the new $gpterm.",
- 'admg' => "additional members of the $gpterm.",
+ '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 $gpterm, do not make any selections.",
- 'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of $gpterm members triggered by specified role and section changes.",
+ "create the group, there is no need to pick any criteria.",
+ 'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section changes in the course.",
'acty' => 'Access types',
'coro' => $crstype.' roles',
'cose' => $crstype.' sections',
@@ -1346,13 +1744,11 @@ sub membership_options {
future => &mt('Will have future access'),
);
- #FIXME need to plumb around for the various cr roles defined by the user
- my @roles = ('st','cc','in','ta','ep');
+ my @roles = ('st','cc','in','ta','ep','cr');
my @sections = keys(%{$sectioncount});
- &topic_bar($r,$image,$lt{'pipa'});
- $r->print('
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'pipa'}).'
'.$lt{'gmem'}.' '.$lt{'picr'});
if ($action eq 'create') {
$r->print($lt{'meof'}.' '.$lt{'ifno'}.' '.$lt{'asub'});
@@ -1365,23 +1761,21 @@ sub membership_options {
');
- $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles));
+ $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles,undef,undef,1,$cdom,$cnum));
if (@sections > 0) {
@sections = sort {$a cmp $b} @sections;
unshift(@sections,'none'); # Put 'no sections' next
unshift(@sections,'all'); # Put 'all' at the front of the list
- $r->print('
');
return;
@@ -1396,7 +1790,7 @@ sub sections_selection {
}
foreach my $sec (@{$sections}) {
if ($sec eq 'all') {
- $section_sel .= ' '."\n";
+ $section_sel .= ' '."\n";
} elsif ($sec eq 'none') {
$section_sel .= ' '."\n";
} else {
@@ -1424,8 +1818,7 @@ sub access_date_settings {
}
}
my ($table) = &date_setting_table($starttime,$endtime,$formname);
- &topic_bar($r,$image,$lt{'sten'});
- $r->print('
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'sten'}).'
'.$table.'
');
return;
@@ -1502,6 +1895,11 @@ sub display_navbuttons {
');
+ } elsif ($prevtext) {
+ $r->print('
+
+ ');
}
if ($next) {
$r->print('
@@ -1528,15 +1926,15 @@ sub print_current_settings {
$granularity,$quota,$available,$unavailable,$gpterm,$ucgpterm) = @_;
my %lt = &Apache::lonlocal::texthash(
- grna => "$ucgpterm Name",
- desc => 'Description',
- grfn => "$ucgpterm Functions",
+ grna => 'Group Name',
+ desc => 'Group Title',
+ grfn => "Collaborative Tools",
gran => 'Granularity',
quot => 'File quota',
dfac => 'Default access dates',
- ygrs => "Your $gpterm selections",
- tfwa => "The following settings will apply to the $gpterm:",
- difn => 'Different functionality for different members:',
+ ygrs => "Your group selections - ",
+ tfwa => "The following settings will apply to the group:",
+ difn => 'Different collaborative tools for different members:',
stda => 'Start date',
enda => 'End date:',
);
@@ -1571,8 +1969,8 @@ sub print_current_settings {
');
if (@{$available} > 0) {
- $r->print('Available:
-
');
+ $r->print(''.&mt('Available for assignment to members:').''.
+ '
');
my $rowcell = int(@{$available}/2) + @{$available}%2;
for (my $i=0; $i<@{$available}; $i++) {
if (@{$available} > 3) {
@@ -1589,8 +1987,8 @@ sub print_current_settings {
$r->print('
');
}
if (@{$unavailable} > 0) {
- $r->print('Unavailable:
-
');
+ $r->print(''.&mt('Unavailable for assignment:').''.
+ '
');
my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;
for (my $j=0; $j<@{$unavailable}; $j++) {
if (@{$unavailable} > 3) {
@@ -1606,10 +2004,11 @@ sub print_current_settings {
}
$r->print('
');
}
+ my $quota_text=&mt('[_1] Mb',$quota);
$r->print(<<"END");
$lt{'difn'} $granularity
-
$quota Mb
+
$quota_text
$lt{'stda'} $showstart $lt{'enda'} $showend
@@ -1623,17 +2022,18 @@ sub pick_new_members {
my ($r,$action,$formname,$available,$idx,$stored,$img,$users,$userdata,
$granularity,$origmembers,$gpterm,$ucgpterm) = @_;
my %lt = &Apache::lonlocal::texthash(
- 'gpme' => "$ucgpterm membership",
+ 'gpme' => "Group membership",
'addm' => 'Add members',
- 'setf' => 'Set functionality',
- 'func' => 'Functionality',
- 'nome' => 'No members to add at this time.',
+ 'setf' => 'Assign collaborative tools',
+ 'func' => 'Tools',
+ 'nome' => 'No members to add at this time, as there are no users '.
+ 'matching the specified type(s), role(s) and section(s).',
'nnew' => "There are no users to add as new members, as all users".
- " matching the specified type(s), role(s), and/or ".
- "section(s) are already affiliated with this $gpterm.",
- 'yoma' => 'You may need to use the '."'".'modify existing, past or '.
- 'future members'."'".' page if you need to re-enable '.
- 'or activate access for previous or future members.',
+ " matching the specified type(s), role(s), and ".
+ "section(s) are already affiliated with this group.",
+ 'yoma' => "You may need to use the 'modify existing, past or ".
+ "future members' page if you need to re-enable ".
+ "or activate access for previous or future members.",
);
my %members;
my $totalusers = 0;
@@ -1657,7 +2057,7 @@ sub pick_new_members {
$r->print(&check_uncheck_tools($r,$available));
}
}
- &topic_bar($r,$img,$lt{'gpme'});
+ $r->print(&Apache::lonhtmlcommon::topic_bar($img,$lt{'gpme'}));
if (keys(%members) > 0) {
$r->print('
@@ -1766,34 +2166,35 @@ sub privilege_specificity {
my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available,
$formname,$gpterm,$ucgpterm) = @_;
my %lt = &Apache::lonlocal::texthash (
- 'uprv' => 'User privileges',
- 'frty' => 'For each type of functionality you have chosen to include, '.
- 'there is a set of standard privileges which apply to all '.
- 'of those for whom the functionality is enabled.',
- 'thar' => 'There are also additional privileges which can be set for '.
- 'some, or all, members. Please choose one of the following:',
- 'fort' => 'For the types of functionality you have chosen to include '.
- 'there are no additional privileges which can be set for some '.
- 'or all members.',
- 'eaty' => 'Each of the types of functionality includes standard '.
- 'privileges which apply to members with access to that '.
- 'functionality, and may also include additional privileges '.
+ 'uprv' => 'User privileges for collaborative tools',
+ 'frty' => 'For each collaborative tool you have chosen to include, '.
+ 'there is a set of core privileges which all group members '.
+ 'assigned use of the tool will receive.',
+ 'thar' => 'For some tools there are also additional optional '.
+ 'privileges which can be set.',
+ 'plch' => 'Choose one of the following:',
+ 'fort' => 'For the collaborative tools you have chosen to include '.
+ 'only core privileges are available, '.
+ 'so there are no optional privileges to assign.',
+ 'eaty' => 'Each collaborative tool includes core '.
+ 'privileges assigned to all members with access to the '.
+ 'tool. Some tools may also feature additional privileges '.
'which can be set for specific members.',
- 'cutg' => "Currently the $gpterm is configured ",
- 'sdif' => "so different $gpterm members can receive different privileges.",
- 'sall' => "so all $gpterm members will receive the same privileges.",
- 'algm' => "All $gpterm members will receive the same privileges.",
- 'smgp' => "Some $gpterm members will receive different privileges from ".
- "others.",
- 'thwi' => "These will be the privileges all $gpterm members receive, ".
- "if you selected the first option above.",
+ 'cutg' => 'Currently the group is configured ',
+ 'sdif' => 'so different members can receive different optional privileges for a particular tool.',
+ 'sall' => 'so all members will receive the same optional privileges for a particular tool.',
+ 'algm' => 'All group members will receive the same privileges for any tool assigned to them, including the default set of optional privileges.',
+ 'smgp' => 'Different group members may receive different privileges from '.
+ 'others for the tools they have been assigned.',
+ 'thwi' => 'These will be the privileges all group members receive for a particular assigned tool, '.
+ 'if you selected the first option above.',
'thes' => "These will be the privileges given to members assigned ".
- "in the future, including via automatic $gpterm assignment ".
- "for specific sections/roles ",
- 'asyo' => "As you have chosen not to include any functionality in the ".
- "$gpterm, no default user privileges settings need to be set.",
- 'plin' => 'Please indicate which optional privileges members '.
- 'will receive by default.',
+ "in the future via automatic group assignment ".
+ "for users who receive specific sections/roles in the course ",
+ 'asyo' => "As you have chosen not to include any collaborative tools ".
+ "in the group, no default optional privileges need to be set.",
+ 'plin' => 'Indicate which optional privileges members '.
+ 'will receive by default for a specific tool.',
'oppr' => 'Optional privileges',
'defp' => 'The default privileges new members will receive are:',
);
@@ -1805,9 +2206,9 @@ sub privilege_specificity {
}
}
}
- &topic_bar($r,$img,$lt{'uprv'});
+ $r->print(&Apache::lonhtmlcommon::topic_bar($img,$lt{'uprv'}));
if ((($action eq 'create') && (@{$available} > 0)) ||
- (($action eq 'modify') && ($formname eq 'change_settings'))) {
+ (($action eq 'modify') && ($formname eq 'change_settings'))) {
my %specific = (
'No' => 'checked="checked"',
'Yes' => '',
@@ -1815,7 +2216,7 @@ sub privilege_specificity {
if ($action eq 'create') {
$r->print($lt{'frty'}.' ');
if ($totaloptionalprivs) {
- $r->print($lt{'thar'});
+ $r->print($lt{'thar'}.'
'.$lt{'plch'});
} else {
$r->print($lt{'fort'});
}
@@ -1831,16 +2232,16 @@ sub privilege_specificity {
}
if ($totaloptionalprivs) {
$r->print('
-
+
-');
+
');
} else {
$r->print('');
}
if ($totaloptionalprivs) {
$r->print($lt{'plin'});
if ($action eq 'create') {
- $r->print(' '.$lt{'thwi'});
+ $r->print(' '.$lt{'thwi'});
}
$r->print(' '.$lt{'thes'});
if ($action eq 'create') {
@@ -1864,6 +2265,7 @@ sub privilege_specificity {
} else {
if ($action eq 'create') {
$r->print($lt{'asyo'});
+ $r->print('');
} elsif ($action eq 'modify' && $formname eq 'pick_members') {
my @defprivs;
if (ref($$stored{'defpriv'}) eq 'ARRAY') {
@@ -1888,7 +2290,7 @@ sub default_privileges {
'addp' => 'Additional privileges',
'fixp' => 'Fixed privileges',
'oppr' => 'Optional privileges',
- 'func' => 'Function',
+ 'func' => 'Collaborative Tool',
);
$r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box').
&Apache::lonhtmlcommon::row_title($lt{'func'},undef,
@@ -1908,7 +2310,8 @@ sub default_privileges {
if ($fixed ne '') {
$fixed .= '
');
- if ($num_expire) {
+ if ($num_items->{'active'}) {
&check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
}
- if ($num_reenable) {
+ if ($num_items->{'previous'}) {
&check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
}
- if ($num_activate) {
+ if ($num_items->{'future'}) {
&check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
}
&check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
@@ -2136,7 +2545,7 @@ END
$colspan++;
}
if ($addtools) {
- $r->print('
'.&mt('Additional Functionality').'
');
+ $r->print('
'.&mt('Additional Tools').'
');
$colspan++;
}
$r->print(&Apache::loncommon::end_data_table_header_row());
@@ -2249,8 +2658,10 @@ END
}
}
$r->print(&Apache::loncommon::end_data_table());
+ } else {
+ $r->print(&mt('There are no active, future or previous group members to modify.'));
}
- return;
+ return $numcurrent;
}
sub check_uncheck_buttons {
@@ -2291,7 +2702,7 @@ sub change_privs_form {
} else {
$nexttext = $$navbuttons{'mose'};
}
- &topic_bar($r,3,&mt('Members to delete or expire'));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('Members to delete or expire')));
my $exp_or_del = 0;
if (ref($$memchg{'deletion'}) eq 'ARRAY') {
if (@{$$memchg{'deletion'}} > 0) {
@@ -2319,7 +2730,7 @@ sub change_privs_form {
$r->print($lt{'nome'}.' ');
}
- &topic_bar($r,4,&mt('[_1] member privileges',$ucgpterm));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(4,&mt('Setting optional privileges for specific group members')));
my $numchgs = &member_privileges_form($r,$action,$formname,$tools,
$toolprivs,$fixedprivs,$userdata,
@@ -2336,7 +2747,7 @@ sub change_privs_form {
}
sub add_members_form {
- my ($r,$action,$formname,$page,$startdate,$enddate,$groupname,
+ my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,$groupname,
$description,$granularity,$quota,$sectioncount,$tools,$functions,
$stored,$states,$navbuttons,$gpterm,$ucgpterm)=@_;
$r->print(' ');
@@ -2346,7 +2757,8 @@ sub add_members_form {
&print_current_settings($r,$action,$functions,$startdate,$enddate,
$groupname,$description,$granularity,$quota,
\@available,\@unavailable,$gpterm,$ucgpterm);
- &membership_options($r,$action,$formname,$sectioncount,1,$gpterm,$ucgpterm);
+ &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,1,$gpterm,
+ $ucgpterm);
my $nexttext = $$navbuttons{'gtns'};
my $prevtext = $$navbuttons{'gtpp'};
&display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
@@ -2375,20 +2787,18 @@ sub choose_privs_form {
$nexttext = $$navbuttons{'adme'};
}
- &topic_bar($r,6,&mt('[_1] member privileges',$ucgpterm));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(6,&mt('Setting optional privileges for specific group members')));
&member_privileges_form($r,$action,$formname,$tools,$toolprivs,
$fixedprivs,$userdata,$usertools,$idx,undef,
$states,$stored,$gpterm);
if ($action eq 'create') {
- if (keys(%{$sectioncount}) > 0) {
- my $img1 = 7;
- my $img2 = 8;
- &mapping_options($r,$action,$formname,$page,$sectioncount,
- $states,$stored,$navbuttons,$img1,$img2,
- $gpterm,$ucgpterm,$crstype);
- }
+ my $img1 = 7;
+ my $img2 = 8;
+ &mapping_options($r,$action,$formname,$page,$sectioncount,
+ $states,$stored,$navbuttons,$img1,$img2,
+ $gpterm,$ucgpterm,$crstype,$cdom,$cnum);
}
my $prevtext = $$navbuttons{'gtps'};
&display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
@@ -2459,21 +2869,24 @@ sub member_privileges_form {
$usertools,$idx,$memchg,$states,$stored,$gpterm) = @_;
my %lt = &Apache::lonlocal::texthash(
'addp' => 'Additional privileges',
- 'fixp' => 'Fixed privileges',
+ 'fixp' => 'Core privileges',
'oppr' => 'Optional privileges',
- 'func' => 'Function',
- 'forf' => 'For the functionality you have chosen to include '.
- 'there are no optional privileges to set besides '.
- 'the standard privileges.',
- 'algr' => "All $gpterm members will receive the same privileges.",
- 'asno' => "As no $gpterm members are being added, ".
- "there are no specific user privileges to set.",
- 'asng' => "As no $gpterm tools will be made available to users, ".
- "there are no specific user privileges to set.",
- 'nogm' => "No $gpterm 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 ",
+ 'func' => 'Tool',
+ 'forf' => 'For the collaborative tools included for group '.
+ 'members being added or modified, '.
+ 'there are no optional privileges to set '.
+ 'for specific members.',
+ 'algr' => 'All new group members will receive the same privileges.', 'ifex' => 'If previously expired members are being re-enabled, or '.
+ 'if access for future members is being activated now, '.
+ 'previously set privileges will be preserved.',
+ 'asno' => 'As no group members are being added, '.
+ '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 '.
+ 'tools for any current members.',
'full' => 'Fullname',
'user' => 'Username',
'doma' => 'Domain',
@@ -2599,7 +3012,7 @@ END
}
} else {
if (keys(%{$usertools}) > 0) {
- $r->print($lt{'algr'}.'
');
+ $r->print($lt{'algr'}.' '.$lt{'ifex'}.'
');
&display_defprivs($r,$tools,$toolprivs,\@defprivs);
} else {
$r->print($lt{'asno'}.' ');
@@ -2707,11 +3120,19 @@ sub write_group_data {
}
if ($quota !~ /^\d*\.?\d*$/) {
$quota = 0;
- $r->print(&mt('The value you entered for the quota for the file repository in this [_1] contained invalid characters, so it has been set to 0 Mb. You can change this by modifying the [_1] settings. ',$gpterm));
+ $r->print('
'
+ .&mt('The value you entered for the quota for the file repository in this '.$gpterm
+ .' contained invalid characters, so it has been set to 0 Mb. You can change this by'
+ .' modifying the '.$gpterm.' settings.')
+ .'
');
}
if ($quota > $maxposs) {
$quota = $maxposs;
- $r->print(&mt('The value you entered for the quota for the file repository in this [_1] exceeded the maximum possible value, so it has been set to [_2] Mb (the maximum possible value). ',$gpterm,$maxposs));
+ $r->print('
'
+ .&mt('The value you entered for the quota for the file repository in this '.$gpterm
+ .' exceeded the maximum possible value, so it has been set to [_1] Mb '
+ .'(the maximum possible value).',sprintf("%.2f",$maxposs))
+ .'
');
}
my %groupinfo = (
description => $esc_description,
@@ -2776,12 +3197,65 @@ sub write_group_data {
my $result = &add_group_folder($cdom,$cnum,$now,$groupname,$action,
$description,$tools,\%groupinfo,
$gpterm,$ucgpterm,$crstype);
- if ($result ne 'ok') {
- $r->print(&mt('A problem occurred when creating folders for the new [_1]. [_2]. ',$gpterm,$result));
+ if ($result eq 'ok') {
+ $r->print('
'
+ .&mt($ucgpterm.' [_1] was created.',''.$groupname.'')
+ .'
');
+ } else {
+ $r->print('
'
+ .&mt('A problem occurred when creating folders for the new '.$gpterm.' [_1]:'
+ ,''.$groupname.'')
+ .' '.$result
+ .'
');
+ }
+ } elsif ($action eq 'modify') {
+ my (@oldtools,@newtools);
+ if (ref($$stored{'tool'}) eq 'ARRAY') {
+ @oldtools = @{$$stored{'tool'}};
+ }
+ if (ref($tools) eq 'ARRAY') {
+ @newtools = @{$tools};
+ }
+ if (!grep(/^discussion$/,@oldtools) &&
+ grep(/^discussion$/,@newtools)) {
+ my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
+ my $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence';
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my $bbmapres = $navmap->getResourceByUrl($boardsmap);
+ undef($navmap);
+ if (!$bbmapres) {
+ my $grpmap = $crspath.'group_folder_'.$groupname.'.sequence';
+ my $disctitle = &mt('Discussion Boards');
+ my $outcome = &map_updater($cdom,$cnum,'group_boards_'.
+ $groupname.'.sequence','bbseq',
+ $disctitle,$grpmap);
+ my ($furl,$ferr) =
+ &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+ $navmap = Apache::lonnavmaps::navmap->new();
+ # modify parameter
+ if ($outcome eq 'ok') {
+ my $parm_result = &parm_setter($navmap,$cdom,$boardsmap,
+ $groupname);
+ if ($parm_result) {
+ $r->print('
'
+ .&mt($ucgpterm.' [_1] was updated.',''.$groupname.'')
+ .'
');
}
} else {
my %actiontype = (
@@ -2791,8 +3265,10 @@ sub write_group_data {
&Apache::lonnet::logthis("Failed to store $gpterm $groupname ".
'in '.lc($crstype).': '.$cnum.
' in domain: '.$cdom);
- $r->print(&mt('An error occurred when [_1] the [_2]. '.
- 'Please try again.',$actiontype{$action},$gpterm));
+ $r->print('
'
+ .&mt('An error occurred when [_1] the '.$gpterm.'. '
+ .'Please try again.',$actiontype{$action})
+ .'
');
}
return $result;
}
@@ -2811,6 +3287,7 @@ sub process_membership {
my %curr_start = ();
my %curr_end = ();
my %tooltype = ();
+ my $context = 'processgroupmembership';
foreach my $tool (@{$tools}) {
foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
@@ -2880,7 +3357,7 @@ sub process_membership {
$curr_privs{$user};
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
$user,$now,$savestart,
- $curr_privs{$user}) eq 'ok') {
+ $curr_privs{$user},'',$context) eq 'ok') {
push(@{$added{'expired'}},$user);
$num_ok ++;
} else {
@@ -2891,7 +3368,7 @@ sub process_membership {
foreach my $user (@deletion) {
$usersettings{$groupname.':'.$user} = $now.':-1:';
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
- $user,$now,'-1','')
+ $user,$now,'-1','','',$context)
eq 'ok') {
push(@{$added{'deleted'}},$user);
$num_ok ++;
@@ -2945,7 +3422,7 @@ sub process_membership {
$group_privs{$user};
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
$user,$end,$start,
- $group_privs{$user}) eq 'ok') {
+ $group_privs{$user},'',$context) eq 'ok') {
push(@{$added{$type}},$user);
$num_ok ++;
} else {
@@ -2984,7 +3461,9 @@ sub process_membership {
}
if ($num_fail) {
foreach my $type (sort(keys(%failed))) {
- $r->print(&mt('The following users could not be [_1], because an error occurred: ',$type));
+ $r->print('
'
+ .&mt("The following users could not be $type, because an error occurred:")
+ .'
');
foreach my $user (@{$failed{$type}}) {
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.' ');
}
@@ -3000,7 +3479,7 @@ sub process_membership {
}
if ($roster_result eq 'ok') {
$r->print(' '.&mt('[_1] membership list updated.',$ucgpterm));
- $r->print('
'.&mt("For full access to all of [_1]'s privileges, users will need to log out and log back in.",$groupname).'
');
+ $r->print('
'.&mt("Any currently logged in course users affected by the changes you made to group membership or privileges for the [_1] group will need to log out and log back in for their LON-CAPA sessions to reflect these changes.",$groupname).'
');
} else {
$r->print(' '.&mt('An error occurred while updating the [_1] membership list -',$gpterm).$roster_result.' ');
}
@@ -3009,13 +3488,13 @@ sub process_membership {
sub mapping_options {
my ($r,$action,$formname,$page,$sectioncount,$states,$stored,
- $navbuttons,$img1,$img2,$gpterm,$ucgpterm,$crstype) = @_;
+ $navbuttons,$img1,$img2,$gpterm,$ucgpterm,$crstype,$cdom,$cnum) = @_;
my %lt = &Apache::lonlocal::texthash(
'auto' => "Settings for automatic $gpterm enrollment",
'gmma' => "$ucgpterm membership mapping to specific sections/roles",
'endi' => "Enable/disable automatic $gpterm enrollment for ".
"users in specified roles and sections",
- 'adds' => "If automatic $gpterm enrollment is enabled, when a user is assigned a ".lc($crstype)."-wide or section-specific role, he/she will automatically be added as a member of the $gpterm, with start and end access dates defined by the default dates set for the $gpterm, unless he/she is already a $gpterm member, with access dates that permit either current or future $gpterm access.",
+ 'adds' => "If automatic $gpterm enrollment is enabled, when a user is newly assigned a ".lc($crstype)."-wide or section-specific role, he/she will automatically be added as a member of the $gpterm, with start and end access dates defined by the default dates set for the $gpterm, unless he/she is already a $gpterm member, with access dates that permit either current or future $gpterm access.",
'drops' => "If automatic $gpterm disenrollment is enabled, when a user's role is expired, access to the $gpterm will be terminated unless the user continues to have other ".lc($crstype)."-wide or section-specific active or future roles which receive automatic membership in the $gpterm.",
'pirs' => "Pick roles and sections for automatic $gpterm enrollment",
'curr' => 'Currently set to',
@@ -3026,7 +3505,8 @@ sub mapping_options {
'mapr' => "Mapping of roles and sections affected by automatic $gpterm enrollment/disenrollment follows scheme chosen below.",
);
&automapping($r,$action,$stored,\%lt,$img1);
- &mapping_settings($r,$sectioncount,\%lt,$stored,$img2,$crstype);
+ &mapping_settings($r,$sectioncount,\%lt,$stored,$img2,$crstype,$cdom,$cnum,
+ $action);
return;
}
@@ -3040,8 +3520,7 @@ sub automapping {
if (exists($$stored{'autodrop'})) {
$drop = $$stored{'autodrop'};
}
- &topic_bar($r,$image,$$lt{'endi'});
- $r->print('
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'endi'}).'
'.$$lt{'gmma'}.': '.$$lt{'adds'}.' '.$$lt{'drops'}.'
'.$$lt{'auad'}.':
');
@@ -3059,16 +3538,18 @@ sub automapping {
}
sub mapping_settings {
- my ($r,$sectioncount,$lt,$stored,$image,$crstype) = @_;
+ my ($r,$sectioncount,$lt,$stored,$image,$crstype,$cdom,$cnum,$action) = @_;
my @sections = keys(%{$sectioncount});
if (@sections > 0) {
@sections = sort {$a cmp $b} @sections;
unshift(@sections,'none'); # Put 'no sections' next
unshift(@sections,'all'); # Put 'all' at the front of the list
+ } else {
+ @sections = ('all','none');
}
- &topic_bar($r,$image,$$lt{'pirs'});
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'pirs'}));
my @roles = &standard_roles();
- my %customroles = &my_custom_roles();
+ my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum);
$r->print(&Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row());
$r->print('
@@ -3079,57 +3560,60 @@ sub mapping_settings {
}
$r->print(&Apache::loncommon::end_data_table_header_row()."\n");
foreach my $role (@roles) {
- my $plrole=&Apache::lonnet::plaintext($role,$crstype);
- my $sections_sel;
- if (@sections > 0) {
- if ($role eq 'cc') {
- $sections_sel = '