--- loncom/interface/loncoursegroups.pm 2006/07/20 03:11:52 1.54 +++ loncom/interface/loncoursegroups.pm 2006/08/17 23:36:05 1.60 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursegroups.pm,v 1.54 2006/07/20 03:11:52 raeburn Exp $ +# $Id: loncoursegroups.pm,v 1.60 2006/08/17 23:36:05 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -127,6 +127,15 @@ sub print_main_menu { function changeSort(caller) { document.$state.sortby.value = caller; document.$state.submit(); +} +function openGroupRoster(group,status) { + var url = '/adm/grouproster?'; + url += 'group='+group+'&status='+status+'&ref=popup'; + var title = 'Group Membership'; + var options = 'scrollbars=1,resizable=1,menubar=0'; + options += ',width=700,height=600'; + rosterbrowser = open(url,title,options,'1'); + rosterbrowser.focus(); }\n|; $r->print(&header('Groups',$jscript,$action,$state)); if ($env{'form.refpage'} eq 'enrl') { @@ -965,6 +974,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) { @@ -1026,7 +1036,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); @@ -1150,39 +1160,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, @@ -1193,8 +1218,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 = (); @@ -1206,7 +1231,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'}; @@ -1342,7 +1367,7 @@ 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' => 'Build a list of users for selection of group members', @@ -1364,8 +1389,7 @@ 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}); @@ -1388,7 +1412,7 @@ sub membership_options { '); $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types)); $r->print(''); - $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 @@ -1825,7 +1849,7 @@ sub privilege_specificity { } &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' => '', @@ -1882,6 +1906,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') { @@ -2362,7 +2387,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('
'); @@ -2372,7 +2397,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, @@ -2412,7 +2438,7 @@ sub choose_privs_form { my $img2 = 8; &mapping_options($r,$action,$formname,$page,$sectioncount, $states,$stored,$navbuttons,$img1,$img2, - $gpterm,$ucgpterm,$crstype); + $gpterm,$ucgpterm,$crstype,$cdom,$cnum); } my $prevtext = $$navbuttons{'gtps'}; &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, @@ -2807,7 +2833,47 @@ sub write_group_data { $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)); - } else { + } 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 { @@ -3036,7 +3102,7 @@ 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", @@ -3053,7 +3119,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; } @@ -3086,7 +3153,7 @@ 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; @@ -3097,7 +3164,7 @@ sub mapping_settings { } &topic_bar($r,$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(' @@ -3108,57 +3175,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 = ''. - &mt('all sections').''; - } else { - $sections_sel=''. - §ions_selection(\@sections,'sec_'.$role). - ''; - } - } - $r->print(&Apache::loncommon::start_data_table_row(). - ''.$plrole. - ''.$sections_sel. - &Apache::loncommon::end_data_table_row()); + 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).''; - } - $r->print(&Apache::loncommon::start_data_table_row(). - ''.&mt('Custom role: '). - ''.$role.''.$sections_sel. - &Apache::loncommon::end_data_table_row()); + 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(&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,$gpterm) = @_; my @menu = @@ -3320,7 +3390,7 @@ sub add_group_folder { my $grpfolder = &mt('[_1] Folder -',$ucgpterm,).$description; $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/smppg'; my $grptitle = &mt('Group homepage').' - '.$description; - my ($seqid,$discussions,$disctitle); + my ($discussions,$disctitle); my $outcome = &map_updater($cdom,$cnum,'group_folder_'.$groupname.'.sequence', 'grpseq',$grpfolder,$allgrpsmap,$grppage, $grptitle); @@ -3332,7 +3402,6 @@ sub add_group_folder { # Link to folder for bulletin boards $grpmap = $crspath.'group_folder_'.$groupname.'.sequence'; if (grep/^discussion$/,@{$tools}) { - $seqid = $now + 1; $disctitle = &mt('Discussion Boards'); my $outcome = &map_updater($cdom,$cnum,'group_boards_'.$groupname. '.sequence','bbseq',$disctitle,$grpmap); @@ -3349,9 +3418,6 @@ sub add_group_folder { # modify parameters my $parm_result; if ($action eq 'create') { - if ($allgrpsmap) { - $parm_result .= &parm_setter($navmap,$cdom,$allgrpsmap,$groupname); - } if ($grpmap) { $parm_result .= &parm_setter($navmap,$cdom,$grpmap,$groupname); }