--- loncom/interface/loncoursegroups.pm 2006/04/10 19:59:53 1.13
+++ loncom/interface/loncoursegroups.pm 2006/05/18 22:13:48 1.20
@@ -30,6 +30,7 @@ use Apache::loncommon;
use Apache::lonhtmlcommon;
use Apache::lonlocal;
use Apache::lonnavmaps;
+use Apache::longroup;
use Apache::Constants qw(:common :http);
sub handler {
@@ -37,7 +38,7 @@ sub handler {
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
-
+
if ($r->header_only) {
return OK;
}
@@ -106,8 +107,7 @@ sub print_main_menu {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/coursegroups",
text=>"Course Groups",});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs
- (undef,'Course Groups'));
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Groups'));
&display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
$view_permission,$manage_permission,$action,$rowColor1,
$rowColor2);
@@ -155,8 +155,8 @@ sub display_groups {
if (!defined($action)) {
$action = 'view';
}
- my %curr_groups;
- if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) {
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
+ if (%curr_groups) {
$r->print(' ');
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print(<<"END");
@@ -183,7 +183,7 @@ END
my %Sortby = ();
foreach my $group (sort(keys(%curr_groups))) {
%{$grp_info{$group}} =
- &Apache::loncommon::get_group_settings(
+ &Apache::longroup::get_group_settings(
$curr_groups{$group});
my $members_result = &group_members($cdom,$cnum,$group,
\%grp_info);
@@ -246,7 +246,7 @@ END
if ($action eq 'modify' || $action eq 'delete') {
$link .= $group;
} else {
- $link .= $group.'/grppg?register=1';
+ $link .= $group.'/grppg';
}
$link .= '">'.$lt{$action}.'';
$r->print('
'.$link.' '.$group.' '.$description.' '.$creator.' '. &Apache::lonnavmaps::timeToHumanString($creation).' '. &Apache::lonnavmaps::timeToHumanString($modified).' '.$functionality.' '.$quota.' '.$totalmembers.' '.$totalfiles.' '.$boards.' '.$diskuse.' ');
@@ -268,15 +268,15 @@ END
my @coursegroups = split(/:/,$env{'request.course.groups'});
if (@coursegroups > 0) {
$r->print(' ');
- my %curr_groups;
- if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) {
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
+ if (%curr_groups) {
foreach my $group (@coursegroups) {
- my %group_info = &Apache::loncommon::get_group_settings(
+ my %group_info = &Apache::longroup::get_group_settings(
$curr_groups{$group});
my $description = &Apache::lonnet::unescape(
$group_info{description});
my ($uname,$udom) = split(/:/,$group_info{creator});
- $r->print(''.$group,' '.$description.' ');
+ $r->print(''.$group,' '.$description.' ');
}
}
} else {
@@ -434,7 +434,10 @@ sub group_administration {
);
if (ref($stored{'autorole'}) eq 'ARRAY') {
foreach my $role (@{$stored{'autorole'}}) {
- $elements{'modify'}{'change_settings'}{'sec_'.$role} = 'selectbox';
+ unless ($role eq 'cc') {
+ $elements{'modify'}{'change_settings'}{'sec_'.$role} =
+ 'selectbox';
+ }
}
}
%{$elements{'create'}{'pick_members'}} = (
@@ -455,9 +458,8 @@ sub group_administration {
(($state eq 'pick_name') || ($state eq 'pick_privs'))) ||
(($action eq 'modify') && (($state eq 'change_settings') ||
($state eq 'add_members')))) {
- my $numsections = &Apache::loncommon::get_sections($cdom,$cnum,
- \%sectioncount);
- if ($numsections > 0) {
+ %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';
@@ -474,7 +476,7 @@ sub group_administration {
}
if (defined($env{'form.sectionpick'})) {
@sections=&Apache::loncommon::get_env_multiple('form.sectionpick');
- if (grep/^_all$/,@sections) {
+ if (grep/^all$/,@sections) {
@sections = sort {$a cmp $b} keys(%sectioncount);
}
}
@@ -559,7 +561,7 @@ sub group_administration {
if (($state eq 'pick_privs') || ($state eq 'change_privs') ||
(($specificity eq 'No') &&
- (($state eq 'result') || ($state eq 'memresult')))) {
+ (($state eq 'addresult') || ($state eq 'memresult')))) {
foreach my $tool (@tools) {
my @values = &Apache::loncommon::get_env_multiple('form.user_'.$tool);
foreach my $user (@values) {
@@ -689,7 +691,7 @@ function changeSort(caller) {
document.$state.sortby.value = caller;
document.$state.submit();
}
-
+
|;
$jscript .= &Apache::lonhtmlcommon::set_form_elements(
\%{$elements{$action}{$state}},\%stored);
@@ -772,7 +774,7 @@ function changeSort(caller) {
&Apache::lonhtmlcommon::add_breadcrumb(
{text=>"$trail{$action}{$state}"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs
- (undef,'Course Groups Manager'));
+ ('Course Groups Manager'));
&display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page,
\%sectioncount,$groupname,$description,$functions,
\@tools,\%toolprivs,\%fixedprivs,$startdate,$enddate,
@@ -797,7 +799,7 @@ function changeSort(caller) {
&Apache::lonhtmlcommon::add_breadcrumb(
{text=>"View groups"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs
- (undef,'Course Groups Manager'));
+ ('Course Groups Manager'));
&display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
$view_permission,$manage_permission,$action,
$rowColor1,$rowColor2);
@@ -809,55 +811,57 @@ function changeSort(caller) {
sub retrieve_settings {
my ($cdom,$cnum,$groupname) = @_;
- my %groupinfo;
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname);
+
+ return if (!%curr_groups);
+
+ my %groupinfo =
+ &Apache::longroup::get_group_settings($curr_groups{$groupname});
+
my %stored;
- my %curr_groups;
- my $numgroups = &Apache::loncommon::coursegroups(\%curr_groups,$cdom,
- $cnum,$groupname);
- if ($numgroups > 0) {
- %groupinfo = &Apache::loncommon::get_group_settings(
- $curr_groups{$groupname});
- $stored{'description'} = &Apache::lonnet::unescape(
- $groupinfo{'description'});
- $stored{'startdate'} = $groupinfo{'startdate'};
- $stored{'enddate'} = $groupinfo{'enddate'};
- if ($stored{'enddate'} == 0) {
- $stored{'no_end_date'} = 1;
- }
- $stored{'granularity'} = $groupinfo{'granularity'};
- $stored{'specificity'} = $groupinfo{'specificity'};
- $stored{'creation'} = $groupinfo{'creation'};
- $stored{'creator'} = $groupinfo{'creator'};
-
- foreach my $tool (sort(keys(%{$groupinfo{'functions'}}))) {
- if ($groupinfo{functions}{$tool} eq 'on') {
- push(@{$stored{tool}},$tool);
- }
- }
- foreach my $role (@{$groupinfo{'roles'}}) {
- push(@{$stored{roles}},$role);
- }
- foreach my $type (@{$groupinfo{'types'}}) {
- push(@{$stored{types}},$type);
- }
- foreach my $section (@{$groupinfo{'sectionpick'}}) {
- push(@{$stored{sectionpick}},$section);
- }
- foreach my $defpriv (@{$groupinfo{'defpriv'}}) {
- push(@{$stored{defpriv}},$defpriv);
- }
- $stored{'autoadd'} = $groupinfo{'autoadd'};
- $stored{'autodrop'} = $groupinfo{'autodrop'};
- if (exists($groupinfo{'autosec'})) {
- foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) {
- foreach my $section (@{$groupinfo{'autosec'}{$role}}) {
- push (@{$stored{'sec_'.$role}},$section);
- }
- if (@{$groupinfo{'autosec'}{$role}} > 0) {
- push(@{$stored{'autorole'}},$role);
- }
+
+ $stored{'description'} =
+ &Apache::lonnet::unescape($groupinfo{'description'});
+ $stored{'startdate'} = $groupinfo{'startdate'};
+ $stored{'enddate'} = $groupinfo{'enddate'};
+ if ($stored{'enddate'} == 0) {
+ $stored{'no_end_date'} = 1;
+ }
+ $stored{'granularity'} = $groupinfo{'granularity'};
+ $stored{'specificity'} = $groupinfo{'specificity'};
+ $stored{'creation'} = $groupinfo{'creation'};
+ $stored{'creator'} = $groupinfo{'creator'};
+
+ foreach my $tool (sort(keys(%{$groupinfo{'functions'}}))) {
+ if ($groupinfo{functions}{$tool} eq 'on') {
+ push(@{$stored{tool}},$tool);
+ }
+ }
+ foreach my $role (@{$groupinfo{'roles'}}) {
+ push(@{$stored{roles}},$role);
+ }
+ foreach my $type (@{$groupinfo{'types'}}) {
+ push(@{$stored{types}},$type);
+ }
+ foreach my $section (@{$groupinfo{'sectionpick'}}) {
+ push(@{$stored{sectionpick}},$section);
+ }
+ foreach my $defpriv (@{$groupinfo{'defpriv'}}) {
+ push(@{$stored{defpriv}},$defpriv);
+ }
+ $stored{'autoadd'} = $groupinfo{'autoadd'};
+ $stored{'autodrop'} = $groupinfo{'autodrop'};
+ if (exists($groupinfo{'autosec'})) {
+ 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) {
+ push(@{$stored{'autorole'}},$role);
+ }
}
- }
+ }
}
return %stored;
}
@@ -1213,7 +1217,7 @@ sub membership_options {
previous => &mt('Previously had access'),
future => &mt('Will have future access'),
);
-
+
my @roles = ('st','cc','in','ta','ep','cr');
my @sections = keys(%{$sectioncount});
@@ -1249,8 +1253,8 @@ sub membership_options {
$r->print(&Apache::lonhtmlcommon::role_select_row(\@roles));
if (@sections > 0) {
@sections = sort {$a cmp $b} @sections;
- unshift(@sections,'_all'); # Put 'all' at the front of the list
- unshift(@sections,'_nosec'); # Put 'no sections' next
+ unshift(@sections,'all'); # Put 'all' at the front of the list
+ unshift(@sections,'none'); # Put 'no sections' next
$r->print('
'.
§ions_selection(\@sections,'sectionpick').' ');
@@ -1271,9 +1275,9 @@ sub sections_selection {
$numvisible = @{$sections};
}
foreach my $sec (@{$sections}) {
- if ($sec eq '_all') {
+ if ($sec eq 'all') {
$section_sel .= ' all sections'."\n";
- } elsif ($sec eq '_nosec') {
+ } elsif ($sec eq 'none') {
$section_sel .= ' no section'."\n";
} else {
$section_sel .= ' '.$sec."\n";
@@ -2309,7 +2313,7 @@ END
$r->print('');
if ($granularity eq 'Yes') {
foreach my $tool (@{$current{$user}{newtools}}) {
- $r->print(' print(' '.$tool.
' ');
@@ -2590,7 +2594,9 @@ sub member_privileges_form {
}
$specificity = $env{'form.specificity'};
} else {
- @defprivs = @{$$stored{'defpriv'}};
+ if (defined($$stored{'defpriv'})) {
+ @defprivs = @{$$stored{'defpriv'}};
+ }
$specificity = $$stored{'specificity'};
}
my @showtools;
@@ -2712,7 +2718,6 @@ END
' ');
&display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools,
$toolprivs,\@defprivs);
-
}
} else {
if (keys(%{$usertools}) > 0) {
@@ -2775,7 +2780,9 @@ sub process_request {
@defprivs = @temp;
}
} else {
- @defprivs = @{$$stored{'defpriv'}};
+ if (defined($$stored{'defpriv'})) {
+ @defprivs = @{$$stored{'defpriv'}};
+ }
}
my $outcome;
@@ -2811,7 +2818,7 @@ sub write_group_data {
'creation','modified','creator','granularity',
'specificity','autoadd','autodrop');
my @mult_attributes = ('roles','types','sectionpick','defpriv');
-
+
my %groupinfo = (
description => $esc_description,
startdate => $startdate,
@@ -2850,14 +2857,11 @@ sub write_group_data {
}
my $autosec;
my @autorole = &Apache::loncommon::get_env_multiple('form.autorole');
-
+
foreach my $role (@autorole) {
if (defined($env{'form.sec_'.$role})) {
my @autosections=&Apache::loncommon::get_env_multiple('form.sec_'.
$role);
- if (grep/^_all$/,@autosections) {
- @autosections = sort {$a cmp $b} keys(%{$sectioncount});
- }
$autosec .= '';
foreach my $sec (@autosections) {
$autosec .= '';
@@ -2901,6 +2905,7 @@ sub process_membership {
my $num_ok = 0;
my $num_fail = 0;
my %group_privs = ();
+ my %curr_privs = ();
my %tooltype = ();
foreach my $tool (@{$tools}) {
@@ -2939,6 +2944,7 @@ sub process_membership {
my @expire = ();
my @deletion = ();
my @reenable = ();
+ my @unchanged = ();
if ($state eq 'memresult') {
if (ref($$memchg{'activate'}) eq 'ARRAY') {
@activate = @{$$memchg{'activate'}};
@@ -2952,21 +2958,25 @@ sub process_membership {
if (ref($$memchg{'reenable'}) eq 'ARRAY') {
@reenable = @{$$memchg{'reenable'}};
}
+ my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
+ $groupname);
+ foreach my $key (sort(keys(%membership))) {
+ if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
+ (undef,undef,$curr_privs{$1})=split(/:/,$membership{$key},3);
+ }
+ }
if (@expire + @deletion > 0) {
- my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
- $groupname);
foreach my $user (@expire) {
- my ($currend,$currstart,@userprivs) =
- split(/:/,$membership{$groupname.':'.$user});
- $group_privs{$user} = join(':',@userprivs);
+ my ($currend,$currstart,$grp_privs) =
+ split(/:/,$membership{$groupname.':'.$user},3);
if ($currstart > $now) {
$currstart = $now;
}
$usersettings{$groupname.':'.$user} = $now.':'.$currstart.':'.
- $group_privs{$user};
+ $grp_privs;
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
$user,$now,$currstart,
- $group_privs{$user}) eq 'ok') {
+ $grp_privs) eq 'ok') {
push(@{$added{'expired'}},$user);
$num_ok ++;
} else {
@@ -2990,10 +3000,17 @@ sub process_membership {
}
foreach my $user (sort(keys(%{$usertools}))) {
+ if ((grep(/^$user$/,@expire)) || (grep(/^$user$/,@deletion))) {
+ next;
+ }
my $type;
my $start = $startdate;
my $end = $enddate;
if ($state eq 'memresult') {
+ if ($curr_privs{$user} eq $group_privs{$user}) {
+ push(@unchanged,$user);
+ next;
+ }
$type = 'modified';
if (@activate > 0) {
if (grep/^$user$/,@activate) {
@@ -3026,7 +3043,7 @@ sub process_membership {
if ($num_ok) {
foreach my $type (sort(keys(%added))) {
$r->print(&mt('The following users were successfully [_1]',$type));
- if (!($type eq 'deleted' || $type eq 'expired')) {
+ if (!($type eq 'deleted' || $type eq 'expired')) {
$r->print(&mt(' with the following privileges'));
}
$r->print(': ');
@@ -3047,6 +3064,7 @@ sub process_membership {
}
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.$privlist.' ');
}
+ $r->print(' ');
}
}
if ($num_fail) {
@@ -3056,11 +3074,19 @@ sub process_membership {
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.' ');
}
}
+ $r->print(' ');
+ }
+ if (@unchanged > 0) {
+ $r->print(&mt('No change occurred for the following users: '));
+ foreach my $user (sort(@unchanged)) {
+ $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.' ');
+ }
+ $r->print(' ');
}
if ($roster_result eq 'ok') {
- $r->print(' Group membership list updated.');
+ $r->print(' '.&mt('Group membership list updated.'));
} else {
- $r->print(' An error occurred while updating the group membership list -'.$roster_result.' ');
+ $r->print(' '.&mt('An error occurred while updating the group membership list -').$roster_result.' ');
}
return;
}
@@ -3118,7 +3144,7 @@ sub automapping {
'.$$lt{'auad'}.':
- on off');
+ on off ');
if ($action eq 'modify') {
$r->print(' ('.$$lt{'curr'}.' '.$$lt{$add}.' )');
}
@@ -3130,7 +3156,7 @@ sub automapping {
'.$$lt{'auex'}.':
- on off');
+ on off ');
if ($action eq 'modify') {
$r->print(' ('.$$lt{'curr'}.' '.$$lt{$drop}.' )');
}
@@ -3153,8 +3179,8 @@ sub mapping_settings {
my @sections = keys(%{$sectioncount});
if (@sections > 0) {
@sections = sort {$a cmp $b} @sections;
- unshift(@sections,'_nosec'); # Put 'no sections' next
- unshift(@sections,'_all'); # Put 'all' at the front of the list
+ unshift(@sections,'none'); # Put 'no sections' next
+ unshift(@sections,'all'); # Put 'all' at the front of the list
}
&topic_bar($r,$tabcol,$image,$$lt{'pirs'});
$r->print('
@@ -3178,8 +3204,15 @@ sub mapping_settings {
my $plrole=&Apache::lonnet::plaintext($role);
my $sections_sel;
if (@sections > 0) {
- $sections_sel=''.§ions_selection(\@sections,'sec_'.$role).
- ' ';
+ if ($role eq 'cc') {
+ $sections_sel = ''.
+ &mt('all sections').' ';
+ } else {
+ $sections_sel=''.
+ §ions_selection(\@sections,'sec_'.$role).
+ ' ';
+ }
}
if ($rowNum %2 == 1) {
$rowColor = $rowColor1;
@@ -3212,7 +3245,7 @@ sub mapping_settings {
}
sub standard_roles {
- my @roles = ('st','ep','ta','in','cc');
+ my @roles = ('cc','in','ta','ep','st');
return @roles;
}
@@ -3412,11 +3445,9 @@ function toggleTools(field,caller) {
sub validate_groupname {
my ($groupname,$action,$cdom,$cnum) = @_;
- my %sectioncount;
- my $numsec=&Apache::loncommon::get_sections($cdom,$cnum,\%sectioncount);
- my %curr_groups;
- my $numgroups=&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum);
-
+ my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum);
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
+
my %lt = &Apache::lonlocal::texthash (
igna => 'Invalid group name',
tgne => 'The group name entered ',
@@ -3430,7 +3461,7 @@ sub validate_groupname {
thgr => '- does not correspond to the name of an existing'.
' group ',
);
-
+
my $exitmsg = ''.$lt{'igna'}.' '.$lt{'tgne'}.' "'.
$groupname.'" ';
my $dupmsg = $lt{'grna'};
@@ -3439,21 +3470,16 @@ sub validate_groupname {
$earlyout = $exitmsg.$lt{'isno'}.' '.$lt{'gnmo'};
return $earlyout;
}
- if ($numsec) {
- if (exists($sectioncount{$groupname})) {
- $earlyout = $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.
- ' '.$lt{'grna'};
- return $earlyout;
- }
+ if (exists($sectioncount{$groupname})) {
+ return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.
+ ' '.$lt{'grna'};
}
- if ($action eq 'create') {
- if ($numgroups) {
- if (exists($curr_groups{$groupname})) {
- $earlyout = $exitmsg.$lt{'cnnb'}.&mt('an existing group').
- $lt{'inth'}.' '.$lt{'grna'};
- return $earlyout;
- }
- }
+ if ($action eq 'create'
+ && exists($curr_groups{$groupname})) {
+
+ return $exitmsg.$lt{'cnnb'}.&mt('an existing group').
+ $lt{'inth'}.' '.$lt{'grna'};
+
} elsif ($action eq 'modify') {
unless(exists($curr_groups{$groupname})) {
$earlyout = &mt('Group name:').' '.$groupname.$lt{'thgr'}.$lt{'inth'};