-
-
-
- '.$lt{'grna'}.'
- '.$lt{'desc'}.'
- '.$lt{'grfn'}.'
- '.$lt{'gran'}.'
- '.$lt{'dfac'}.'
-
-
- '.$groupname.'
- '.$description.'
+ '.$groupname.'
+ '.$description.'
');
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) {
@@ -1545,8 +1929,8 @@ sub print_current_settings {
$r->print(' ');
}
}
- $r->print(''.$$functions{$$available[$i]}.
- ' ');
+ $r->print(''.$$functions{$$available[$i]}.
+ ' ');
}
if ((@{$available} > 3) && (@{$available}%2)) {
$r->print(' ');
@@ -1554,8 +1938,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) {
@@ -1563,8 +1947,8 @@ sub print_current_settings {
$r->print(' ');
}
}
- $r->print(''.$$functions{$$unavailable[$j]}.
- ' ');
+ $r->print(''.$$functions{$$unavailable[$j]}.
+ ' ');
}
if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {
$r->print(' ');
@@ -1573,33 +1957,30 @@ sub print_current_settings {
}
$r->print(<<"END");
- $lt{'difn'}
- $granularity
- $lt{'stda'} $showstart
- $lt{'enda'} $showend
+ $lt{'difn'} $granularity
+ $quota Mb
+ $lt{'stda'} $showstart
+ $lt{'enda'} $showend
-
-
-
-
END
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
- $r->print('
');
+ $r->print(&Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::end_data_table());
return;
}
sub pick_new_members {
- my ($r,$action,$formname,$tabcol,$rowColor1,$rowColor2,$available,$idx,
- $stored,$img,$users,$userdata,$granularity,$origmembers) = @_;
+ my ($r,$action,$formname,$available,$idx,$stored,$img,$users,$userdata,
+ $granularity,$origmembers,$gpterm,$ucgpterm) = @_;
my %lt = &Apache::lonlocal::texthash(
- 'gpme' => 'Group membership',
+ 'gpme' => "Group membership",
'addm' => 'Add members',
- 'setf' => 'Set functionality',
- 'func' => 'Functionality',
- 'nome' => 'No members to add at this time.',
- '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 group.',
+ '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 ".
+ "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.',
@@ -1626,61 +2007,51 @@ sub pick_new_members {
$r->print(&check_uncheck_tools($r,$available));
}
}
- &topic_bar($r,$tabcol,$img,$lt{'gpme'});
+ &topic_bar($r,$img,$lt{'gpme'});
if (keys(%members) > 0) {
$r->print('
-
-
-
-
-
-
-
-
-
-
-
');
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
$r->print('
-
-
- '.&mt('Add?').'
- '.&mt('Name').'
- '.&mt('Username').'
-
- '.&mt('Domain').'
- ID
+ '.&mt('Add?').'
+ '.&mt('Name').'
+ '.&mt('Username').'
+ '.&mt('Domain').'
+ '.&mt('ID').'
+ '.&mt('Section').'
');
if (@{$available} > 0) {
- $r->print(''.$lt{'func'}.' ');
+ $r->print(''.$lt{'func'}.' ');
}
- $r->print(' ');
+ $r->print(&Apache::loncommon::end_data_table_header_row());
if (@{$available} > 0) {
if ($granularity eq 'Yes') {
- $r->print('
-
- '.&mt('All:').' ');
+ $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'
+
+ '.&mt('All:').' ');
foreach my $tool (@{$available}) {
$r->print(' '.''.$tool.' ');
}
- $r->print(' ');
+ $r->print('');
}
}
my %Sortby = ();
@@ -1693,29 +2064,28 @@ sub pick_new_members {
push(@{$Sortby{$members{$user}[$$idx{udom}]}},$user);
} elsif ($env{'form.sortby'} eq 'id') {
push(@{$Sortby{$members{$user}[$$idx{id}]}},$user);
+ } elsif ($env{'form.sortby'} eq 'section') {
+ push(@{$Sortby{$members{$user}[$$idx{section}]}},$user);
} else {
push(@{$Sortby{$members{$user}[$$idx{fullname}]}},$user);
}
}
- my $rowNum = 0;
- my $rowColor;
foreach my $key (sort(keys(%Sortby))) {
foreach my $user (@{$Sortby{$key}}) {
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
- }
my $id = $members{$user}[$$idx{id}];
my $fullname = $members{$user}[$$idx{fullname}];
my $udom = $members{$user}[$$idx{udom}];
my $uname = $members{$user}[$$idx{uname}];
- $r->print('
- '.
- $fullname.' '.$uname.' '.
- $udom.' '.$id.' ');
+ my $section = $members{$user}[$$idx{section}];
+ $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').
+ ' '.
+ ''.$fullname.' '.
+ ''.$uname.' '.
+ ''.$udom.' '.
+ ''.$id.' '.
+ ''.$section.' ');
if (@{$available} > 0) {
- $r->print(''.
+ $r->print(''.
' ');
foreach my $tool (@{$available}) {
if ($granularity eq 'Yes') {
@@ -1726,66 +2096,55 @@ sub pick_new_members {
$tool.'" value="'.$user.'" />'.$tool.' ');
}
}
- $r->print(' ');
+ $r->print(' ');
}
- $r->print(' '."\n");
- $rowNum ++;
+ $r->print(&Apache::loncommon::end_data_table_row()."\n");
}
}
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
- $r->print('
-
- ');
+ $r->print(&Apache::loncommon::end_data_table());
} else {
- $r->print('
-
-
-
-');
if ($totalusers > 0) {
$r->print($lt{'nnew'}.' '.$lt{'yoma'});
} else {
$r->print($lt{'nome'});
}
- $r->print('
-
- ');
}
return $newusers;
}
sub privilege_specificity {
- my ($r,$tabcol,$rowColor1,$rowColor2,$action,$img,$tools,$stored,
- $toolprivs,$fixedprivs,$available,$formname) = @_;
+ 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 group is configured ',
- 'sdif' => 'so different group members can receive different privileges.',
- 'sall' => 'so all group members will receive the same privileges.',
- 'algm' => 'All group members will receive the same privileges.',
- 'smgp' => 'Some group members will receive different privileges from '.
- 'others.',
- 'thwi' => 'These will be the privileges all group members receive, '.
+ '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 group assignment '.
- 'for specific sections/roles ',
- 'asyo' => 'As you have chosen not to include any functionality in the '.
- 'group, no default user privileges settings need to be set.',
- 'plin' => 'Please indicate which optional privileges members '.
- 'will receive by default.',
+ 'thes' => "These will be the privileges given to members assigned ".
+ "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:',
);
@@ -1797,14 +2156,9 @@ sub privilege_specificity {
}
}
}
- &topic_bar($r,$tabcol,$img,$lt{'uprv'});
- $r->print('
-
-
-
- ');
+ &topic_bar($r,$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' => '',
@@ -1812,7 +2166,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'});
}
@@ -1828,23 +2182,16 @@ sub privilege_specificity {
}
if ($totaloptionalprivs) {
$r->print('
- '.$lt{'algm'}.'
- '.$lt{'smgp'}.'
-
-
-
-
- ');
+
+ '.$lt{'algm'}.'
+ '.$lt{'smgp'}.' ');
} else {
$r->print(' ');
}
if ($totaloptionalprivs) {
- $r->print('
-
-
- '.$lt{'plin'});
+ $r->print($lt{'plin'});
if ($action eq 'create') {
- $r->print(' '.$lt{'thwi'});
+ $r->print(' '.$lt{'thwi'});
}
$r->print(' '.$lt{'thes'});
if ($action eq 'create') {
@@ -1853,30 +2200,22 @@ sub privilege_specificity {
$r->print('('.&mt('if enabled below').').');
}
$r->print('
-
-
-
-
- ');
+ ');
&check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'});
$r->print('
-
-
-
-
-
');
} else {
- $r->print(' '.$lt{'algm'}.' ');
+ $r->print($lt{'algm'}.' ');
}
- &default_privileges($r,$action,$tabcol,$rowColor1,$rowColor2,
- $tools,$toolprivs,$fixedprivs,$available);
+ &default_privileges($r,$action,$tools,$toolprivs,$fixedprivs,
+ $available);
} 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') {
@@ -1889,98 +2228,88 @@ sub privilege_specificity {
$r->print($lt{'sall'});
}
$r->print(' '.$lt{'defp'}.' ');
- &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,
- $toolprivs,\@defprivs);
+ &display_defprivs($r,$tools,$toolprivs,\@defprivs);
}
}
- $r->print('
-
-
-');
return;
}
sub default_privileges {
- my ($r,$action,$tabcol,$rowColor1,$rowColor2,$tools,$toolprivs,
- $fixedprivs,$available) = @_;
+ my ($r,$action,$tools,$toolprivs,$fixedprivs,$available) = @_;
my %lt = &Apache::lonlocal::texthash(
'addp' => 'Additional privileges',
'fixp' => 'Fixed privileges',
'oppr' => 'Optional privileges',
- 'func' => 'Function',
+ 'func' => 'Collaborative Tool',
);
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
- $r->print('
-
-
-
- '.$lt{'func'}.'
-
-
- '.$lt{'fixp'}.'
-
-
- '.$lt{'oppr'}.'
-
-
-
- ');
+ $r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box').
+ &Apache::lonhtmlcommon::row_title($lt{'func'},undef,
+ 'LC_groups_functionality'));
+ $r->print(join('',@{$tools}));
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ my $fixed = '';
+ my $dynamic = '';
foreach my $tool (@{$tools}) {
- $r->print('
-
-
- '.$tool.'
-
- ');
my $privcount = 0;
- my $fixed = '';
- my $dynamic = '';
+ if ($dynamic ne '') {
+ $dynamic .= '';
+ }
+ $dynamic .= ''."\n".'
- ');
+ $dynamic .= '
';
}
- $r->print(' '."\n");
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{'fixp'},undef,
+ 'LC_groups_fixed').
+ $fixed.
+ &Apache::lonhtmlcommon::row_closure(1));
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{'oppr'},undef,
+ 'LC_groups_optional').
+ $dynamic.
+ &Apache::lonhtmlcommon::end_pick_box());
$r->print(' ');
return;
+
}
sub display_defprivs {
- my ($r,$tabcol,$rowColor1,$rowColor2,$tools,$toolprivs,$defprivs) = @_;
+ my ($r,$tools,$toolprivs,$defprivs) = @_;
+ my $function = &Apache::loncommon::get_users_function();
+ my $tabcol = &Apache::loncommon::designparm($function.'.tabbg');
+ my $rowColor1 = "#dddddd";
+ my $rowColor2 = "#eeeeee";
my %lt = &Apache::lonlocal::texthash(
'priv' => 'Privileges',
- 'func' => 'Function',
+ 'func' => 'Collaborative Tool',
);
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print('');
@@ -1990,7 +2319,7 @@ sub display_defprivs {
@{$currprivs{$tool}} = ();
foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
if (ref($defprivs) eq 'ARRAY') {
- if (grep/^\Q$priv\E$/,@{$defprivs}) {
+ if (grep(/^\Q$priv\E$/,@{$defprivs})) {
push(@{$currprivs{$tool}},$priv);
}
}
@@ -2046,13 +2375,13 @@ sub display_defprivs {
sub change_members_form {
- my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$groupname,$description,
+ my ($r,$cdom,$cnum,$action,$formname,$page,$groupname,$description,
$startdate,$enddate,$tools,$fixedprivs,$functions,$users,$userdata,
- $granularity,$specificity,$idx,$states,$navbuttons,$rowColor1,
- $rowColor2) = @_;
+ $granularity,$quota,$specificity,$idx,$states,$navbuttons,$gpterm,
+ $ucgpterm) = @_;
my %lt = &Apache::lonlocal::texthash(
- grse => 'Group settings',
- mogm => 'Modify group membership',
+ grse => "$ucgpterm settings",
+ mogm => "Modify $gpterm membership",
);
my @regexps = ('user_','userpriv_');
$r->print(&Apache::lonhtmlcommon::echo_form_input(
@@ -2067,38 +2396,27 @@ sub change_members_form {
my $prevtext = $$navbuttons{'gtpp'};
$r->print('
-
-');
- &topic_bar($r,$tabcol,1,$lt{'grse'});
- $r->print('
-
-
-
-');
- &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,
- $functions,$startdate,$enddate,$groupname,
- $description,$granularity,\@available,\@unavailable);
-$r->print('
- ');
- &topic_bar($r,$tabcol,2,$lt{'mogm'});
- $r->print('
-
-
-
');
- ¤t_membership($r,$cdom,$cnum,$formname,$tabcol,$rowColor1,
- $rowColor2,$groupname,\@available,\@unavailable,
- $fixedprivs,$granularity,$specificity);
- $r->print(' ');
- &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
- $$states{$action}[$page+1],$nexttext);
- $r->print('
');
+ &topic_bar($r,1,$lt{'grse'});
+ &print_current_settings($r,$action,$functions,$startdate,$enddate,
+ $groupname,$description,$granularity,$quota,
+ \@available,\@unavailable,$gpterm,$ucgpterm);
+ &topic_bar($r,2,$lt{'mogm'});
+ my $numcurrent = ¤t_membership($r,$cdom,$cnum,$formname,$groupname,
+ \@available,\@unavailable,$fixedprivs,
+ $granularity,$specificity);
+ if ($numcurrent > 0) {
+ &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
+ $$states{$action}[$page+1],$nexttext);
+ } else {
+ &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext);
+ }
return;
}
sub current_membership {
- my ($r,$cdom,$cnum,$formname,$tabcol,$rowColor1,$rowColor2,$groupname,
- $available,$unavailable,$fixedprivs,$granularity,$specificity) = @_;
+ my ($r,$cdom,$cnum,$formname,$groupname,$available,$unavailable,
+ $fixedprivs,$granularity,$specificity) = @_;
my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
$groupname);
my %lt = &Apache::lonlocal::texthash(
@@ -2112,117 +2430,34 @@ sub current_membership {
'reen' => 'Re-enable',
'acti' => 'Activate',
'dele' => 'Delete',
- 'curf' => 'Current Functionality',
+ 'curf' => 'Current Tool Set',
'chpr' => 'Change Privileges'
);
- if (keys(%membership) > 0) {
- my %current = ();
- my %allnames = ();
- my $hastools = 0;
- my $addtools = 0;
- my $num_reenable = 0;
- my $num_activate = 0;
- my $num_expire - 0;
- foreach my $key (sort(keys(%membership))) {
- if ($key =~ /^\Q$groupname\E:([^:]+):([^:]+)$/) {
- my $uname = $1;
- my $udom = $2;
- my $user = $uname.':'.$udom;
- my($end,$start,@userprivs) = split(/:/,$membership{$key});
- unless ($start == -1) {
- $allnames{$udom}{$uname} = 1;
- $current{$user} = {
- uname => $uname,
- udom => $udom,
- start => &Apache::lonlocal::locallocaltime($start),
- currtools => [],
- newtools => [],
- };
-
- if ($end == 0) {
- $current{$user}{end} = 'No end date';
- } else {
- $current{$user}{end} =
- &Apache::lonlocal::locallocaltime($end);
- }
- my $now = time;
- if (($end > 0) && ($end < $now)) {
- $current{$user}{changestate} = 'reenable';
- $num_reenable++;
- } elsif (($start > $now)) {
- $current{$user}{changestate} = 'activate';
- $num_activate ++;
- } else {
- $current{$user}{changestate} = 'expire';
- $num_expire ++;
- }
- if (@userprivs > 0) {
- foreach my $tool (sort(keys(%{$fixedprivs}))) {
- foreach my $priv (keys(%{$$fixedprivs{$tool}})) {
- if (grep/^$priv$/,@userprivs) {
- push(@{$current{$user}{currtools}},$tool);
- last;
- }
- }
- }
- $hastools = 1;
- }
- if (@{$available} > 0) {
- if (@{$current{$user}{currtools}} > 0) {
- if ("@{$available}" ne "@{$current{$user}{currtools}}") {
- foreach my $tool (@{$available}) {
- unless (grep/^$tool$/,@{$current{$user}{currtools}}) {
- push(@{$current{$user}{newtools}},$tool);
- }
- }
- }
- } else {
- @{$current{$user}{newtools}} = @{$available};
- }
- if (@{$current{$user}{newtools}} > 0) {
- $addtools = 1;
- }
- }
- }
- }
- }
- if (keys(%current) > 0) {
- my %idhash;
- foreach my $udom (keys(%allnames)) {
- %{$idhash{$udom}} = &Apache::lonnet::idrget($udom,
- keys(%{$allnames{$udom}}));
- foreach my $uname (keys(%{$idhash{$udom}})) {
- $current{$uname.':'.$udom}{'id'} = $idhash{$udom}{$uname};
- }
- foreach my $uname (keys(%{$allnames{$udom}})) {
- $current{$uname.':'.$udom}{'fullname'} =
- &Apache::loncommon::plainname($uname,$udom,
- 'lastname');
- }
- }
- $r->print('
-
-
-
+ my ($current,$num_items,$hastools,$addtools) =
+ &Apache::longroup::group_memberlist($cdom,$cnum,$groupname,$fixedprivs,
+ $available);
+ my $numcurrent = scalar(keys(%{$current}));
+ if ($numcurrent > 0) {
+ $r->print('
');
- if ($num_expire) {
- &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
- }
- if ($num_reenable) {
- &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
- }
- if ($num_activate) {
- &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
+ if ($num_items->{'active'}) {
+ &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
+ }
+ if ($num_items->{'previous'}) {
+ &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
+ }
+ if ($num_items->{'future'}) {
+ &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
+ }
+ &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
+ if (@{$available} > 0) {
+ if ($specificity eq 'Yes') {
+ &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});
}
- &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
- if (@{$available} > 0) {
- if ($specificity eq 'Yes') {
- &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});
- }
- if ($granularity eq 'Yes') {
- $r->print(&check_uncheck_tools($r,$available));
- $r->print('
+ if ($granularity eq 'Yes') {
+ $r->print(&check_uncheck_tools($r,$available));
+ $r->print('
'.$lt{'curf'}.'
@@ -2235,197 +2470,179 @@ sub current_membership {
');
- }
}
- $r->print(<<"END");
+ }
+ $r->print(<<"END");
-
-
-
-
-
-
-
-
-
+
END
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
- $r->print(<<"END");
-
-
- $lt{'actn'}
- $lt{'name'}
- $lt{'usnm'}
-
- $lt{'doma'}
- ID
- $lt{'stda'}
- $lt{'enda'}
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
+ $r->print(<<"END");
+ $lt{'actn'}
+ $lt{'name'}
+ $lt{'usnm'}
+ $lt{'doma'}
+ ID
+ $lt{'stda'}
+ $lt{'enda'}
END
- my $colspan = 0;
- if ($hastools) {
- $r->print(''.$lt{'curf'}.' ');
- $colspan ++;
- }
- if ($addtools) {
- $r->print('Additional Functionality ');
- $colspan ++;
- }
- $r->print(' ');
- if ($colspan) {
- if ($granularity eq 'Yes') {
- $r->print('
+ my $colspan = 0;
+ if ($hastools) {
+ $r->print(''.$lt{'curf'}.' ');
+ $colspan++;
+ }
+ if ($addtools) {
+ $r->print(''.&mt('Additional Tools').' ');
+ $colspan++;
+ }
+ $r->print(&Apache::loncommon::end_data_table_header_row());
+ if ($colspan) {
+ if ($granularity eq 'Yes') {
+ $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'
- '.&mt('All:').
+ '.&mt('All:').
' ');
- foreach my $tool (@{$available}) {
- $r->print(' print(' '.''.$tool.' ');
- }
- $r->print(' ');
+ ' value="'.$tool.'" />'.''.$tool.' ');
}
+ $r->print('');
}
- my %Sortby = ();
- foreach my $user (sort(keys(%current))) {
- if ($env{'form.sortby'} eq 'fullname') {
- push(@{$Sortby{$current{$user}{fullname}}},$user);
- } elsif ($env{'form.sortby'} eq 'username') {
- push(@{$Sortby{$current{$user}{uname}}},$user);
- } elsif ($env{'form.sortby'} eq 'domain') {
- push(@{$Sortby{$current{$user}{udom}}},$user);
- } elsif ($env{'form.sortby'} eq 'id') {
- push(@{$Sortby{$current{$user}{id}}},$user);
- } else {
- push(@{$Sortby{$current{$user}{fullname}}},$user);
- }
+ }
+ my %Sortby = ();
+ foreach my $user (sort(keys(%{$current}))) {
+ if ($env{'form.sortby'} eq 'fullname') {
+ push(@{$Sortby{$$current{$user}{fullname}}},$user);
+ } elsif ($env{'form.sortby'} eq 'username') {
+ push(@{$Sortby{$$current{$user}{uname}}},$user);
+ } elsif ($env{'form.sortby'} eq 'domain') {
+ push(@{$Sortby{$$current{$user}{udom}}},$user);
+ } elsif ($env{'form.sortby'} eq 'id') {
+ push(@{$Sortby{$$current{$user}{id}}},$user);
+ } else {
+ push(@{$Sortby{$$current{$user}{fullname}}},$user);
}
- my $rowNum = 0;
- my $rowColor;
- foreach my $key (sort(keys(%Sortby))) {
- foreach my $user (@{$Sortby{$key}}) {
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
- }
- my $id = $current{$user}{id};
- my $fullname = $current{$user}{fullname};
- my $udom = $current{$user}{udom};
- my $uname = $current{$user}{uname};
- my $start = $current{$user}{start};
- my $end = $current{$user}{end};
- $r->print('
- ');
- if ($current{$user}{changestate} eq 'reenable') {
- $r->print(''.
+ }
+ foreach my $key (sort(keys(%Sortby))) {
+ foreach my $user (@{$Sortby{$key}}) {
+ my $id = $$current{$user}{id};
+ my $fullname = $$current{$user}{fullname};
+ my $udom = $$current{$user}{udom};
+ my $uname = $$current{$user}{uname};
+ my $start = $$current{$user}{start};
+ my $end = $$current{$user}{end};
+ $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').'
+ ');
+ if ($$current{$user}{changestate} eq 'reenable') {
+ $r->print(''.
' '.
$lt{'reen'}.' ');
- } elsif ($current{$user}{changestate} eq 'expire') {
- $r->print(''.
+ } elsif ($$current{$user}{changestate} eq 'expire') {
+ $r->print(''.
' '.
$lt{'expi'}.' ');
- } elsif ($current{$user}{changestate} eq 'activate') {
- $r->print(''.
+ } elsif ($$current{$user}{changestate} eq 'activate') {
+ $r->print(''.
' '.
$lt{'acti'}.' ');
- }
- $r->print(''.
+ }
+ $r->print(''.
' '.
$lt{'dele'}.' ');
- if ($specificity eq 'Yes') {
- $r->print(''.
+ if ($specificity eq 'Yes') {
+ $r->print(''.
' '.$lt{'chpr'}.
' ');
- }
- $r->print('
-
- '.
- $fullname.' '.$uname.' '.
- $udom.' '.$id.' '.$start.
- ' '.$end.' ');
- if ($hastools) {
- $r->print(''.
+ }
+ $r->print('
+ '.
+ ''.$fullname.' '.
+ ''.$uname.' '.
+ ''. $udom.' '.
+ ''.$id.' '.
+ ''.$start.' '.
+ ''.$end.' ');
+ if ($hastools) {
+ $r->print(''.
' ');
- foreach my $tool (@{$current{$user}{currtools}}) {
- if ($granularity eq 'Yes') {
- $r->print(' print(' '.$tool.' ');
- } else {
- $r->print(' print(' '.$tool);
- }
- $r->print(' ');
- }
- $r->print(' ');
+ }
+ $r->print(' ');
}
- if ($addtools) {
- $r->print('');
- if ($granularity eq 'Yes') {
- foreach my $tool (@{$current{$user}{newtools}}) {
- $r->print(' print(' ');
+ }
+ if ($addtools) {
+ $r->print('');
+ if ($granularity eq 'Yes') {
+ foreach my $tool (@{$$current{$user}{newtools}}) {
+ $r->print(' '.$tool.
' ');
- }
- } else {
- foreach my $tool (@{$current{$user}{newtools}}) {
- $r->print(' print(' '.$tool.
' ');
- }
}
- $r->print(' ');
}
- $r->print(' '."\n");
- $rowNum ++;
+ $r->print('');
}
+ $r->print(&Apache::loncommon::end_data_table_row()."\n");
}
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
- $r->print('
-
- ');
}
+ $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 {
my ($r,$formname,$field,$title,$colspan) = @_;
$r->print('
-
'.$title.'
+
-
+
');
}
sub change_privs_form {
- my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$startdate,$enddate,
- $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,
- $memchg,$idx,$states,$stored,$sectioncount,$navbuttons,$rowColor1,
- $rowColor2) = @_;
+ my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,
+ $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,
+ $memchg,$idx,$states,$stored,$sectioncount,$navbuttons,$gpterm,
+ $ucgpterm) = @_;
my @regexps = ('userpriv_');
my $nexttext;
my %lt = &Apache::lonlocal::texthash(
'tode' => 'To be deleted',
'toex' => 'To be expired',
- 'nome' => 'No members to be deleted or expired from the group.',
+ 'nome' => "No members to be deleted or expired from the $gpterm.",
);
$r->print(&Apache::lonhtmlcommon::echo_form_input(
['origin','action','state','page','sortby'],\@regexps));
@@ -2434,43 +2651,40 @@ sub change_privs_form {
} else {
$nexttext = $$navbuttons{'mose'};
}
- $r->print('');
- &topic_bar($r,$tabcol,3,&mt('Members to delete or expire'));
+ &topic_bar($r,3,&mt('Members to delete or expire'));
my $exp_or_del = 0;
if (ref($$memchg{'deletion'}) eq 'ARRAY') {
if (@{$$memchg{'deletion'}} > 0) {
- $r->print(' '.$lt{'tode'}.': ');
+ $r->print(''.$lt{'tode'}.': ');
foreach my $user (@{$$memchg{'deletion'}}) {
$r->print(''.$$userdata{$user}[$$idx{fullname}].
' ('.$user.') ');
}
- $r->print(' ');
+ $r->print('');
$exp_or_del += @{$$memchg{'deletion'}};
}
}
if (ref($$memchg{'expire'}) eq 'ARRAY') {
if (@{$$memchg{'expire'}} > 0) {
- $r->print(' '.$lt{'toex'}.': ');
+ $r->print(''.$lt{'toex'}.': ');
foreach my $user (@{$$memchg{'expire'}}) {
$r->print(''.$$userdata{$user}[$$idx{fullname}].
' ('.$user.') ');
}
- $r->print(' ');
+ $r->print('');
$exp_or_del += @{$$memchg{'expire'}};
}
}
if (!$exp_or_del) {
- $r->print(' '.$lt{'nome'}.
- ' ');
+ $r->print($lt{'nome'}.' ');
}
- &topic_bar($r,$tabcol,4,&mt('Group member privileges'));
+ &topic_bar($r,4,&mt('Setting optional privileges for specific group members'));
- my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools,
+ my $numchgs = &member_privileges_form($r,$action,$formname,$tools,
$toolprivs,$fixedprivs,$userdata,
$usertools,$idx,$memchg,$states,
- $stored,$rowColor1,$rowColor2);
- $r->print(' ');
+ $stored,$gpterm);
my $prevtext = $$navbuttons{'gtps'};
if ($numchgs || $exp_or_del) {
&display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
@@ -2478,47 +2692,34 @@ sub change_privs_form {
} else {
&display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext);
}
- $r->print('
');
return;
}
sub add_members_form {
- my ($r,$tabcol,$action,$formname,$page,$startdate,$enddate,$groupname,
- $description,$granularity,$sectioncount,$tools,$functions,$stored,
- $states,$navbuttons,$rowColor1,$rowColor2) = @_;
- $r->print('
-
-
-
-
-');
+ my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,$groupname,
+ $description,$granularity,$quota,$sectioncount,$tools,$functions,
+ $stored,$states,$navbuttons,$gpterm,$ucgpterm)=@_;
+ $r->print(' ');
my @available = ();
my @unavailable = ();
&check_tools($functions,$tools,\@available,\@unavailable);
- &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,
- $functions,$startdate,$enddate,$groupname,
- $description,$granularity,\@available,\@unavailable);
- $r->print('
-
-
-
-
- ');
-
- &membership_options($r,$action,$formname,$tabcol,$sectioncount,1);
+ &print_current_settings($r,$action,$functions,$startdate,$enddate,
+ $groupname,$description,$granularity,$quota,
+ \@available,\@unavailable,$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,
$$states{$action}[$page+1],$nexttext);
- $r->print('
-
');
return;
}
sub choose_privs_form {
- my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$startdate,$enddate,
- $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,$idx,
- $states,$stored,$sectioncount,$navbuttons,$rowColor1,$rowColor2) = @_;
+ my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,
+ $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,$idx,
+ $states,$stored,$sectioncount,$navbuttons,$gpterm,$ucgpterm,
+ $crstype) = @_;
my @regexps = ('userpriv_');
my $nexttext;
@@ -2535,27 +2736,22 @@ sub choose_privs_form {
$nexttext = $$navbuttons{'adme'};
}
- $r->print('');
- &topic_bar($r,$tabcol,6,&mt('Group member privileges'));
+ &topic_bar($r,6,&mt('Setting optional privileges for specific group members'));
- &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs,
+ &member_privileges_form($r,$action,$formname,$tools,$toolprivs,
$fixedprivs,$userdata,$usertools,$idx,undef,
- $states,$stored,$rowColor1,$rowColor2);
+ $states,$stored,$gpterm);
- $r->print(' ');
if ($action eq 'create') {
- if (keys(%{$sectioncount}) > 0) {
- my $img1 = 7;
- my $img2 = 8;
- &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount,
- $states,$stored,$navbuttons,$img1,$img2,
- $rowColor1,$rowColor2);
- }
+ 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,
$$states{$action}[$page+1],$nexttext);
- $r->print('
');
return;
}
@@ -2618,17 +2814,20 @@ function uncheckAllTools(formname) {
}
sub member_privileges_form {
- my ($r,$tabcol,$action,$formname,$tools,$toolprivs,$fixedprivs,$userdata,
- $usertools,$idx,$memchg,$states,$stored,$rowColor1,$rowColor2) = @_;
+ my ($r,$action,$formname,$tools,$toolprivs,$fixedprivs,$userdata,
+ $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 group members will receive the same privileges.',
+ '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, '.
@@ -2636,7 +2835,7 @@ sub member_privileges_form {
'nogm' => 'No group member privileges to display or set, '.
'as you have not indicated that you will be activating,'.
' re-enabling, changing privileges, or adding/removing '.
- 'functionality for any current members ',
+ 'tools for any current members.',
'full' => 'Fullname',
'user' => 'Username',
'doma' => 'Domain',
@@ -2680,7 +2879,7 @@ sub member_privileges_form {
}
$numchgs = @currmembers;
if (!$numchgs) {
- $r->print(' '.$lt{'nogm'});
+ $r->print($lt{'nogm'});
return $numchgs;
}
}
@@ -2696,17 +2895,14 @@ sub member_privileges_form {
my %total;
if (keys(%{$usertools}) > 1) {
$r->print('
-
-
-
-
+
');
foreach my $tool (@{$tools}) {
if (@{$showboxes{$tool}} > 0) {
$r->print('');
- $r->print(''.
+ $r->print(''.
+ ''.
$tool.' ');
my $privcount = 0;
foreach my $priv (@{$showboxes{$tool}}) {
@@ -2744,63 +2940,50 @@ sub member_privileges_form {
$r->print('
');
}
}
- $r->print('
');
- $r->print(' ');
+ $r->print('
');
}
- $r->print(' ');
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
$r->print(<<"END");
-
- $lt{'full'}
- $lt{'user'}
+ $lt{'full'}
+ $lt{'user'}
$lt{'doma'}
$lt{'addp'}
-
END
- &member_privs_entries($r,$tabcol,$rowColor1,$rowColor2,
- $usertools,$toolprivs,$fixedprivs,
+ $r->print(&Apache::loncommon::end_data_table_header_row());
+ &member_privs_entries($r,$usertools,$toolprivs,$fixedprivs,
$userdata,$idx,\@showtools,\@defprivs,
\@excluded);
- $r->print('');
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
- $r->print('
-
-
-
-');
+ $r->print(&Apache::loncommon::end_data_table());
} else {
- $r->print(' '.$lt{'forf'}.
- ' ');
- &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,
- $toolprivs,\@defprivs);
+ $r->print($lt{'forf'}.' ');
+ &display_defprivs($r,$tools,$toolprivs,\@defprivs);
}
} else {
if (keys(%{$usertools}) > 0) {
- $r->print(' '.$lt{'algr'}.
- ' ');
- &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,
- $toolprivs,\@defprivs);
+ $r->print($lt{'algr'}.' '.$lt{'ifex'}.' ');
+ &display_defprivs($r,$tools,$toolprivs,\@defprivs);
} else {
- $r->print(' '.$lt{'asno'}.
- ' ');
+ $r->print($lt{'asno'}.' ');
}
}
} else {
- $r->print(' '.$lt{'asng'});
+ $r->print($lt{'asng'});
}
return $numchgs;
}
sub process_request {
- my ($r,$cdom,$cnum,$tabcol,$action,$state,$page,$groupname,$description,
+ my ($r,$cdom,$cnum,$action,$state,$page,$groupname,$description,
$specificity,$userdata,$startdate,$enddate,$tools,$functions,$toolprivs,
$usertools,$idx,$types,$roles,$sections,$states,$navbuttons,$memchg,
- $sectioncount,$stored,$rowColor1,$rowColor2) = @_;
+ $sectioncount,$stored,$gpterm,$ucgpterm,$crstype) = @_;
$r->print(&Apache::lonhtmlcommon::echo_form_input(
['origin','action','state','page','sortby']));
- my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum);
+ my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm,
+ $ucgpterm,$crstype);
if ($earlyout) {
$r->print('
@@ -2846,13 +3029,15 @@ sub process_request {
$description,$startdate,$enddate,
$specificity,$functions,$tools,
$sectioncount,$roles,$types,$sections,
- \@defprivs,$stored);
+ \@defprivs,$stored,$gpterm,$ucgpterm,
+ $crstype);
}
if (($action eq 'create' && $outcome eq 'ok') || (($action eq 'modify') &&
(($state eq 'memresult') || ($state eq 'addresult')))) {
&process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools,
$enddate,$startdate,$userdata,$idx,$toolprivs,
- $usertools,$specificity,\@defprivs,$memchg);
+ $usertools,$specificity,\@defprivs,$memchg,$gpterm,
+ $ucgpterm);
}
return;
}
@@ -2860,7 +3045,7 @@ sub process_request {
sub write_group_data {
my ($r,$cdom,$cnum,$action,$state,$groupname,$description,$startdate,
$enddate,$specificity,$functions,$tools,$sectioncount,$roles,$types,
- $sections,$defprivs,$stored) = @_;
+ $sections,$defprivs,$stored,$gpterm,$ucgpterm,$crstype) = @_;
my $now = time;
my $creation = $now;
my $creator = $env{'user.name'}.':'.$env{'user.domain'};
@@ -2871,9 +3056,25 @@ sub write_group_data {
my $esc_description = &escape($description);
my @single_attributes = ('description','functions','startdate','enddate',
'creation','modified','creator','granularity',
- 'specificity','autoadd','autodrop');
+ 'specificity','autoadd','autodrop','quota');
my @mult_attributes = ('roles','types','sectionpick','defpriv');
+ my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,
+ $stored);
+ my $quota = $env{'form.quota'};
+
+ $quota =~ s/^\s*([^\s]*)\s*$/$1/;
+ if ($quota eq '') {
+ $quota = 0;
+ }
+ 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));
+ }
+ 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,sprintf("%.2f",$maxposs)));
+ }
my %groupinfo = (
description => $esc_description,
startdate => $startdate,
@@ -2885,7 +3086,9 @@ sub write_group_data {
specificity => $specificity,
autoadd => $env{'form.autoadd'},
autodrop => $env{'form.autodrop'},
+ quota => $quota,
);
+
foreach my $func (keys(%{$functions})) {
my $status;
if (grep(/^$func$/,@{$tools})) {
@@ -2932,28 +3135,74 @@ sub write_group_data {
if ($result eq 'ok') {
if ($action eq 'create') {
- my $put_result = &create_homepage($cdom,$cnum,$groupname,
- \%groupinfo,$tools);
- $r->print('Group '.$groupname.' was created. ');
- } else {
- $r->print('Group '.$groupname.' was updated. ');
+ 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));
+ }
+ $r->print(&mt('[_1] [_2] was created. ',$ucgpterm,$groupname));
+ } 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('Error while setting parameters '.
+ 'for Discussion Boards folder: '.
+ '[_1] .',$parm_result));
+ } else {
+ $r->print(&mt('Discussion Boards Folder created. '));
+ }
+ } else {
+ $r->print($outcome);
+ }
+ undef($navmap);
+ }
+ }
+ $r->print(&mt('[_1] [_2] was updated. ',$ucgpterm,$groupname));
}
} else {
my %actiontype = (
'create' => 'creating',
'modify' => 'modifying',
);
- &Apache::lonnet::logthis('Failed to store group '.$groupname.
- 'in course: '.$cnum.' in domain: '.$cdom);
- $r->print(&mt('An error occurred when [_1] the new group. '.
- 'Please try again.',$actiontype{$action}));
+ &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));
}
return $result;
}
sub process_membership {
my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,
- $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg)=@_;
+ $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,
+ $gpterm,$ucgpterm)=@_;
my %usersettings = ();
my %added= ();
my %failed = ();
@@ -3064,17 +3313,6 @@ sub process_membership {
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;
@@ -3089,6 +3327,19 @@ sub process_membership {
$type = 'reenabled';
}
}
+ if ($type eq '') {
+ 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';
+ }
} else {
$type = 'added';
}
@@ -3150,43 +3401,40 @@ sub process_membership {
$r->print(' ');
}
if ($roster_result eq 'ok') {
- $r->print(' '.&mt('Group membership list updated.'));
+ $r->print(' '.&mt('[_1] membership list updated.',$ucgpterm));
+ $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 group membership list -').$roster_result.' ');
+ $r->print(' '.&mt('An error occurred while updating the [_1] membership list -',$gpterm).$roster_result.' ');
}
return;
}
sub mapping_options {
- my ($r,$action,$formname,$page,$tabcol,$sectioncount,$states,$stored,
- $navbuttons,$img1,$img2,$rowColor1,$rowColor2) = @_;
+ my ($r,$action,$formname,$page,$sectioncount,$states,$stored,
+ $navbuttons,$img1,$img2,$gpterm,$ucgpterm,$crstype,$cdom,$cnum) = @_;
my %lt = &Apache::lonlocal::texthash(
- 'auto' => 'Settings for automatic group enrollment',
- 'gmma' => 'Group membership mapping to specific sections/roles',
- 'endi' => 'Enable/disable automatic group enrollment for '.
- 'users in specified roles and sections',
- 'adds' => 'If automatic group enrollment is enabled, when a user is assigned a course-wide or section-specific role, he/she will automatically be added as a member of the group, with start and end access dates defined by the default dates set for the group, unless he/she is already a group member, with access dates that permit either current or future group access.',
- 'drops' => "If automatic group disenrollment is enabled, when a user's role is expired, access to the group will be terminated unless the user continues to have other course-wide or section-specific active or future roles which receive automatic membership in the group.",
- 'pirs' => 'Pick roles and sections for automatic group enrollment',
+ '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 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',
'on' => 'on',
'off' => 'off',
- 'auad' => 'Automatically enable group membership when roles are added?',
- 'auex' => 'Automatically expire group membership when roles are removed?',
- 'mapr' => 'Mapping of roles and sections affected by automatic group enrollment/disenrollment follows scheme chosen below.',
+ 'auad' => "Automatically enable $gpterm membership when roles are added?",
+ 'auex' => "Automatically expire $gpterm membership when roles are removed?",
+ 'mapr' => "Mapping of roles and sections affected by automatic $gpterm enrollment/disenrollment follows scheme chosen below.",
);
- &automapping($r,$action,$tabcol,$stored,\%lt,$img1);
- $r->print('
-
-
- ');
- &mapping_settings($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,\%lt,
- $stored,$img2);
+ &automapping($r,$action,$stored,\%lt,$img1);
+ &mapping_settings($r,$sectioncount,\%lt,$stored,$img2,$crstype,$cdom,$cnum,
+ $action);
return;
}
sub automapping {
- my ($r,$action,$tabcol,$stored,$lt,$image) = @_;
+ my ($r,$action,$stored,$lt,$image) = @_;
my $add = 'off';
my $drop = 'off';
if (exists($$stored{'autoadd'})) {
@@ -3195,142 +3443,106 @@ sub automapping {
if (exists($$stored{'autodrop'})) {
$drop = $$stored{'autodrop'};
}
- &topic_bar($r,$tabcol,$image,$$lt{'endi'});
+ &topic_bar($r,$image,$$lt{'endi'});
$r->print('
-
-
-
- '.$$lt{'gmma'}.': '.$$lt{'adds'}.' '.$$lt{'drops'}.'
-
-
-
-
-
-
-
-
+ '.$$lt{'gmma'}.': '.$$lt{'adds'}.' '.$$lt{'drops'}.'
'.$$lt{'auad'}.':
on off ');
if ($action eq 'modify') {
$r->print(' ('.$$lt{'curr'}.' '.$$lt{$add}.' )');
}
$r->print('
-
-
-
-
-
-
+
'.$$lt{'auex'}.':
on off ');
if ($action eq 'modify') {
$r->print(' ('.$$lt{'curr'}.' '.$$lt{$drop}.' )');
}
- $r->print('
-
-
-
-
-
-
-
- '.$$lt{'mapr'}.'
-
-
-');
+ $r->print(' '.$$lt{'mapr'});
}
sub mapping_settings {
- my ($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,$lt,$stored,$image) = @_;
+ 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,$tabcol,$image,$$lt{'pirs'});
- $r->print('
-
-
-
-');
+ &topic_bar($r,$image,$$lt{'pirs'});
my @roles = &standard_roles();
- my %customroles = &my_custom_roles();
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ 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('
-
'.&mt('Active?').'
'.&mt('Role').' ');
if (@sections > 0) {
- $r->print(''.&mt('Sections').' '."\n");
+ $r->print(''.&mt('Sections').' ');
}
- my $rowNum = 0;
- my $rowColor;
+ $r->print(&Apache::loncommon::end_data_table_header_row()."\n");
foreach my $role (@roles) {
- my $plrole=&Apache::lonnet::plaintext($role);
- my $sections_sel;
- if (@sections > 0) {
- if ($role eq 'cc') {
- $sections_sel = ''.
- &mt('all sections').' ';
- } else {
- $sections_sel=''.
- §ions_selection(\@sections,'sec_'.$role).
- ' ';
- }
- }
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
- }
- $r->print(''.$plrole.
- ' '.$sections_sel.' ');
- $rowNum ++;
+ my $roletitle=&Apache::lonnet::plaintext($role,$crstype);
+ $r->print(&print_autorole_item($role,$roletitle,\@sections));
}
+ my @customs;
foreach my $role (sort(keys(%customroles))) {
- my $sections_sel;
- if (@sections > 0) {
- $sections_sel = ''.§ions_selection(\@sections,'sec_'.$role).
- ' ';
- }
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
+ my ($roletitle) = ($role =~ m|^cr/[^/]+/[^/]+/(.+)$|);
+ push (@customs,$role);
+ $r->print(&print_autorole_item($role,$roletitle,\@sections));
+ }
+ if ($action eq 'modify') {
+ foreach my $role (@{$$stored{'autorole'}}) {
+ if ((!grep(/^\Q$role\E$/,@customs)) &&
+ (!grep(/^\Q$role\E$/,@roles))) {
+ my $roletitle;
+ if ($role =~ /^cr/) {
+ ($roletitle) = ($role =~ m|_([^_]+)$|);
+ } else {
+ $roletitle = &Apache::lonnet::plaintext($role,$crstype);
+ }
+ $r->print(&print_autorole_item($role,$roletitle,\@sections));
+ }
}
- $r->print(''.$role.' '.
- $sections_sel.' ');
- $rowNum ++;
}
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ $r->print(&Apache::loncommon::end_data_table());
return;
}
+sub print_autorole_item {
+ my ($role,$roletitle,$sections) = @_;
+ my $sections_sel;
+ if (@{$sections} > 0) {
+ if ($role eq 'cc') {
+ $sections_sel = ''.
+ &mt('all sections').' ';
+ } else {
+ $sections_sel=''.
+ §ions_selection($sections,'sec_'.$role).
+ ' ';
+ }
+ }
+ my $output = &Apache::loncommon::start_data_table_row().
+ ' '.
+ ''.$roletitle.' '.$sections_sel.
+ &Apache::loncommon::end_data_table_row();
+ return $output;
+}
+
sub standard_roles {
my @roles = ('cc','in','ta','ep','st');
return @roles;
}
-sub my_custom_roles {
- my %returnhash=();
- my %rolehash=&Apache::lonnet::dump('roles');
- foreach (keys %rolehash) {
- if ($_=~/^rolesdef\_(\w+)$/) {
- $returnhash{$1}=$1;
- }
- }
- return %returnhash;
-}
-
sub modify_menu {
- my ($r,$groupname,$page) = @_;
+ my ($r,$groupname,$page,$gpterm) = @_;
my @menu =
(
- { text => 'Modify default group settings',
+ { text => "Modify default $gpterm settings",
help => 'Course_Modify_Group',
state => 'change_settings',
branch => 'settings',
@@ -3341,7 +3553,7 @@ sub modify_menu {
state => 'change_members',
branch => 'members',
},
- { text => 'Add member(s) to the group',
+ { text => "Add member(s) to the $gpterm",
help => 'Course_Group_Add_Members',
state => 'add_members',
branch => 'adds',
@@ -3363,10 +3575,8 @@ sub modify_menu {
}
sub member_privs_entries {
- my ($r,$tabcol,$rowColor1,$rowColor2,$usertools,$toolprivs,
- $fixedprivs,$userdata,$idx,$showtools,$defprivs,$excluded) = @_;
- my $rowColor;
- my $rowNum = 0;
+ my ($r,$usertools,$toolprivs,$fixedprivs,$userdata,$idx,$showtools,
+ $defprivs,$excluded) = @_;
foreach my $user (sort(keys(%{$usertools}))) {
if (defined($excluded)) {
if (ref($excluded) eq 'ARRAY') {
@@ -3376,19 +3586,27 @@ sub member_privs_entries {
}
}
my ($uname,$udom) = split(/:/,$user);
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
- }
- $r->print('
+ $r->print(&Apache::loncommon::start_data_table_row().'
'.$$userdata{$user}[$$idx{fullname}].'
'.$uname.'
'.$udom.'
- ');
+
+
+
+ '.
+ &mt('Collaborative Tool').'
+
+
+ '.&mt('Fixed').'
+
+
+ '.&mt('Optional').'
+
+
+ ');
foreach my $tool (@{$showtools}) {
if (exists($$usertools{$user}{$tool})) {
- $r->print(''.$tool.' ');
+ $r->print(''.$tool.' ');
my $privcount = 0;
my $fixed = '';
my $dynamic = '';
@@ -3411,10 +3629,10 @@ sub member_privs_entries {
}
$r->print(''.$fixed.' '.$dynamic.'
');
} else {
- $r->print(' ');
+ $r->print(' ');
}
}
- $rowNum ++;
+ $r->print(&Apache::loncommon::end_data_table_row());
}
}
@@ -3435,27 +3653,172 @@ sub date_setting_table {
'startdate',$starttime);
my $endform = &Apache::lonhtmlcommon::date_setter($formname,
'enddate',$endtime);
- my $perpetual = '
- no ending date ';
- my $start_table = '';
- $start_table .= "\n";
+ return $table;
+}
+
+sub add_group_folder {
+ my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo,
+ $gpterm,$ucgpterm,$crstype) = @_;
+ if ($cdom eq '' || $cnum eq '') {
+ return &mt('Error: invalid course domain or number - group folder creation failed');
+ }
+ my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
+ $allgrpsmap = $crspath.'group_allfolders.sequence';
+ my $topmap = $navmap->getResourceByUrl($allgrpsmap);
+ undef($navmap);
+ if ($action eq 'create') {
+ # check if group_allfolders.sequence exists.
+ if (!$topmap) {
+ my $grpstitle = &mt('[_1] [_2]s',$crstype,$ucgpterm);
+ my $topmap_url = '/'.$env{'course.'.$env{'request.course.id'}.'.url'};
+ $topmap_url =~ s|/+|/|g;
+ if ($topmap_url =~ m|^/uploaded|) {
+ $outcome = &map_updater($cdom,$cnum,'group_allfolders.sequence',
+ 'toplevelgroup',$grpstitle,$topmap_url);
+ if ($outcome ne 'ok') {
+ return $outcome;
+ }
+ } else {
+ $outcome = &mt('Non-standard course - folder for all groups not added.');
+ return $outcome;
+ }
+ }
+ my $grpfolder = &mt('[_1] Folder -',$ucgpterm,).$description;
+ $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/smppg';
+ my $grptitle = &mt('Group homepage').' - '.$description;
+ my ($discussions,$disctitle);
+ my $outcome = &map_updater($cdom,$cnum,'group_folder_'.$groupname.'.sequence',
+ 'grpseq',$grpfolder,$allgrpsmap,$grppage,
+ $grptitle);
+ if ($outcome ne 'ok') {
+ return $outcome;
+ }
+ my $pageout = &create_homepage($cdom,$cnum,$groupname,$groupinfo,
+ $tools,$gpterm,$ucgpterm,$now);
+ # Link to folder for bulletin boards
+ $grpmap = $crspath.'group_folder_'.$groupname.'.sequence';
+ if (grep/^discussion$/,@{$tools}) {
+ $disctitle = &mt('Discussion Boards');
+ my $outcome = &map_updater($cdom,$cnum,'group_boards_'.$groupname.
+ '.sequence','bbseq',$disctitle,$grpmap);
+ if ($outcome ne 'ok') {
+ return $outcome;
+ }
+ $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence';
+ }
+ } else {
+ #modify group folder if status of discussions tools is changed
+ }
+ my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+ $navmap = Apache::lonnavmaps::navmap->new();
+ # modify parameters
+ my $parm_result;
+ if ($action eq 'create') {
+ if ($grpmap) {
+ $parm_result .= &parm_setter($navmap,$cdom,$grpmap,$groupname);
+ }
+ if ($grppage) {
+ $parm_result .= &parm_setter($navmap,$cdom,$grppage,$groupname);
+ }
+ if ($boardsmap) {
+ $parm_result .= &parm_setter($navmap,$cdom,$boardsmap,$groupname);
+ }
+ }
+ if ($parm_result) {
+ return $parm_result;
+ } else {
+ return 'ok';
+ }
+}
+
+sub map_updater {
+ my ($cdom,$cnum,$newfile,$itemname,$itemtitle,$parentmap,$startsrc,
+ $starttitle,$endsrc,$endtitle) = @_;
+ my $outcome;
+ $env{'form.'.$itemname} = &new_map($startsrc,$starttitle,$endsrc,
+ $endtitle);
+ my $newmapurl=&Apache::lonnet::finishuserfileupload($cnum,$cdom,$itemname,
+ $newfile);
+ if ($newmapurl !~ m|^/uploaded|) {
+ $outcome = &mt('Error uploading new folder.')." ($newfile): $newmapurl".' ';
+ return $outcome;
+ }
+ my ($errtext,$fatal)=&LONCAPA::map::mapread($parentmap);
+ if ($fatal) {
+ $outcome = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".' ';
+ return $outcome;
+ } else {
+ my $newidx=&LONCAPA::map::getresidx($newmapurl);
+ $LONCAPA::map::resources[$newidx] = $itemtitle.':'.$newmapurl.
+ ':false:normal:res';
+ $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
+ my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1);
+ if ($outtext) {
+ $outcome = &mt('Error storing updated parent folder')." ($parentmap): $errtext".' ';
+ return $outcome;
+ }
+ }
+ return 'ok';
+}
+
+sub new_map {
+ my ($startsrc,$starttitle,$endsrc,$endtitle) = @_;
+ my $newmapstr = '
+
+
+
+
+
+';
+ return $newmapstr;
+}
+
+sub parm_setter {
+ my ($navmap,$cdom,$url,$groupname) = @_;
+ my $allresults;
+ my %hide_settings = (
+ 'course' => {
+ 'num' => 13,
+ 'set' => 'yes',
+ },
+ 'group' => {
+ 'num' => 5,
+ 'set' => 'no',
+ 'extra' => $groupname,
+ },
+ );
+ my $res = $navmap->getResourceByUrl($url);
+ my $symb = $res->symb();
+ foreach my $level (keys(%hide_settings)) {
+ my $parmresult = &Apache::lonparmset::storeparm_by_symb($symb,
+ '0_hiddenresource',
+ $hide_settings{$level}{'num'},
+ $hide_settings{$level}{'set'},
+ 'string_yesno',undef,$cdom,
+ undef,undef,
+ $hide_settings{$level}{'extra'});
+ if ($parmresult) {
+ $allresults .= $level.': '.$parmresult;
+ }
+ }
+ return $allresults;
}
sub create_homepage {
- my ($cdom,$cnum,$name,$groupinfo,$tools) = @_;
+ my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm,$now) = @_;
my $functionality = join(',',@{$tools});
my $content = &unescape($$groupinfo{description});
$content=~s/\s+$//s;
@@ -3464,11 +3827,11 @@ sub create_homepage {
$content=&Apache::lonfeedback::clear_out_html($content,1);
my %pageinfo = (
- 'aaa_title' => 'Group: '.$name,
+ 'aaa_title' => "$ucgpterm: $name",
'abb_links' => $functionality,
'bbb_content' => $content,
'ccc_webreferences' => '',
- 'uploaded.lastmodified' => time,
+ 'uploaded.lastmodified' => $now,
);
my $putresult = &Apache::lonnet::put('grppage_'.$name,\%pageinfo,$cdom,$cnum);
return $putresult;
@@ -3510,26 +3873,31 @@ function toggleTools(field,caller) {
}
sub validate_groupname {
- my ($groupname,$action,$cdom,$cnum) = @_;
+ my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_;
my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
-
+ my %deleted_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef,
+ 'deleted_groups');
+ if (my $tmp = &Apache::lonnet::error(%deleted_groups)) {
+ undef(%deleted_groups);
+ &Apache::lonnet::logthis('Error retrieving groups: '.$tmp.' in '.$cnum.':'.$cdom);
+ }
my %lt = &Apache::lonlocal::texthash (
- igna => 'Invalid group name',
- tgne => 'The group name entered ',
- grna => 'Group names and section names used in a course '.
- 'must be unique.',
- isno => 'is not a valid name.',
- gnmo => 'Group names may only contain letters, numbers '.
- 'or underscores.',
- cnnb => 'can not be used as it is the name of ',
- inth => ' in this course.',
- thgr => '- does not correspond to the name of an existing'.
- ' group ',
+ igna => "Invalid $gpterm name",
+ tgne => "The $gpterm name entered ",
+ grna => "$ucgpterm names and section names used in a ".
+ "$crstype must be unique.",
+ isno => "is not a valid name.",
+ gnmo => "$ucgpterm names may only contain letters, ".
+ "numbers or underscores.",
+ cnnb => "can not be used as it is the name of ",
+ inth => " in this $crstype",
+ thgr => "- does not correspond to the name of an ".
+ "existing $gpterm",
);
- my $exitmsg = ''.$lt{'igna'}.' '.$lt{'tgne'}.' "'.
- $groupname.'" ';
+ my $exitmsg = ''.$lt{'igna'}.' '.
+ $lt{'tgne'}.' "'.$groupname.'" ';
my $dupmsg = $lt{'grna'};
my $earlyout;
if (($groupname eq '') || ($groupname =~ /\W/)) {
@@ -3540,15 +3908,18 @@ sub validate_groupname {
return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.
' '.$lt{'grna'};
}
- if ($action eq 'create'
- && exists($curr_groups{$groupname})) {
-
- return $exitmsg.$lt{'cnnb'}.&mt('an existing group').
- $lt{'inth'}.' '.$lt{'grna'};
-
+ if ($action eq 'create') {
+ if (exists($curr_groups{$groupname})) {
+ return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).
+ $lt{'inth'}.'. '.$lt{'grna'};
+ } elsif (exists($deleted_groups{$groupname})) {
+ return $exitmsg.$lt{'cnnb'}.&mt('a [_1] which previously existed',$gpterm).
+ $lt{'inth'}.'. '.$lt{'grna'};
+ }
} elsif ($action eq 'modify') {
unless(exists($curr_groups{$groupname})) {
- $earlyout = &mt('Group name:').' '.$groupname.$lt{'thgr'}.$lt{'inth'};
+ $earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}.
+ $lt{'inth'};
return $earlyout;
}
}
@@ -3556,22 +3927,13 @@ sub validate_groupname {
}
sub topic_bar {
- my ($r,$tabcol,$imgnum,$title) = @_;
+ my ($r,$imgnum,$title) = @_;
$r->print('
-
-
-
-
-
-
-
- '.$title.'
-
-
-
-
-
-
+
+
+
'.$title.'
+
');
return;
}
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.