--- loncom/interface/loncoursegroups.pm 2006/05/26 11:10:13 1.23 +++ loncom/interface/loncoursegroups.pm 2006/06/30 22:38:26 1.34 @@ -1,3 +1,6 @@ +# The LearningOnline Network with CAPA +# +# $Id: loncoursegroups.pm,v 1.34 2006/06/30 22:38:26 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -31,7 +34,10 @@ use Apache::lonhtmlcommon; use Apache::lonlocal; use Apache::lonnavmaps; use Apache::longroup; +use Apache::portfolio; use Apache::Constants qw(:common :http); +use lib '/home/httpd/lib/perl/'; +use LONCAPA; sub handler { my ($r) = @_; @@ -64,13 +70,18 @@ sub handler { &Apache::lonnet::allowed('mdg',$env{'request.course.id'}); &Apache::lonhtmlcommon::clear_breadcrumbs(); + my $gpterm = &Apache::loncommon::group_term(); + my $ucgpterm = $gpterm; + $ucgpterm =~ s/^(\w)/uc($1)/e; + my $crstype = &Apache::loncommon::course_type(); + my %functions = ( email => 'E-mail', discussion => 'Discussion boards', chat => 'Chat', files => 'File repository', roster => 'Membership roster', - homepage => 'Group home page', + homepage => $ucgpterm.' home page', ); my %idx = (); @@ -78,6 +89,7 @@ sub handler { $idx{fullname} = &Apache::loncoursedata::CL_FULLNAME(); $idx{udom} = &Apache::loncoursedata::CL_SDOM(); $idx{uname} = &Apache::loncoursedata::CL_SNAME(); + $idx{section} = &Apache::loncoursedata::CL_SECTION(); my $rowColor1 = "#dddddd"; my $rowColor2 = "#eeeeee"; @@ -93,43 +105,47 @@ sub handler { if ($view_permission || $manage_permission) { &group_administration($r,$action,$state,$cdom,$cnum,$function, $tabcol,\%functions,\%idx,$view_permission, - $manage_permission,$rowColor1,$rowColor2); + $manage_permission,$rowColor1,$rowColor2, + $gpterm,$ucgpterm,$crstype); } else { - $r->print(&mt('You do not have group administration '. - 'privileges in this course')); + $r->print(&mt('You do not have [_1] administration '. + 'privileges in this [_2]',$gpterm,lc($crstype))); } } else { &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx, $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); } return OK; } sub print_main_menu { my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$state,$rowColor1,$rowColor2) = @_; + $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm, + $ucgpterm,$crstype) = @_; + my $pagename = "$crstype $ucgpterm".'s'; my $jscript = qq| function changeSort(caller) { document.$state.sortby.value = caller; document.$state.submit(); }\n|; - $r->print(&header('Course Groups',$jscript,$action,$state, + $r->print(&header($pagename,$jscript,$action,$state, undef,$function)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursegroups", - text=>"Course Groups",}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Groups')); + text=>"$pagename"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename)); &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); $r->print(&footer()); return; } sub display_groups { my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$state,$rowColor1,$rowColor2) = @_; + $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm, + $ucgpterm,$crstype) = @_; my %curr_groups = (); my %grp_info = (); my %actionlinks = ( @@ -144,7 +160,7 @@ sub display_groups { view => 'View', delete => 'Delete', act => 'Action', - gname => 'Group Name', + gname => "$ucgpterm Name", desc => 'Description', crea => 'Creator', crtd => 'Created', @@ -154,13 +170,13 @@ sub display_groups { memb => 'Members', file => 'Files', dibd => 'Discussion Boards', - dius => 'Disk Use', - nogr => 'No groups exist.', - crng => 'Create a new group', + dius => 'Disk Use (%)', + nogr => 'No '.$gpterm.'s exist.', + crng => 'Create a new '.$gpterm, alth => 'Although your current role has privileges'. - ' to view any existing groups in this course,'. - ' you do not have privileges to create new'. - ' groups.', + ' to view any existing '.$gpterm.'s in this'. + lc($crstype).', you do not have privileges'. + 'to create new '.$gpterm.'s.', ); if ($view_permission) { if (!defined($action)) { @@ -168,6 +184,9 @@ sub display_groups { } my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum); if (%curr_groups) { + if ($manage_permission) { + $r->print('
'.$lt{'crng'}.''); + } $r->print('

'); $r->print(&Apache::lonhtmlcommon::start_pick_box()); $r->print(<<"END"); @@ -198,12 +217,27 @@ END $curr_groups{$group}); my $members_result = &group_members($cdom,$cnum,$group, \%grp_info); - my $files_result = &group_files($group,\%grp_info); + my $port_path = '/userfiles/groups/'.$group.'/portfolio'; + my $port_dir = &Apache::loncommon::propath($cdom,$cnum).$port_path; + my $totaldirs = 0; + my $totalfiles = 0; + &group_files($group,$port_dir,\$totalfiles,\$totaldirs); + $grp_info{$group}{'totalfiles'} = $totalfiles; + $grp_info{$group}{'totaldirs'} = $totaldirs; + my $diskuse = &Apache::lonnet::diskusage($cdom,$cnum,$port_dir); + if ($grp_info{$group}{'quota'} > 0) { + my $pct_use = 0.1 * $diskuse/$grp_info{$group}{'quota'}; + $grp_info{$group}{'diskuse'} = sprintf("%.0f",$pct_use); + } else { + $grp_info{$group}{'diskuse'} = 'N/A'; + } + my ($groupboards,$boardshash)=&Apache::longroup::get_group_bbinfo( + $cdom,$cnum,$group); + $grp_info{$group}{'boards'} = scalar(@{$groupboards}); if ($env{'form.sortby'} eq 'groupname') { push(@{$Sortby{$group}},$group); } elsif ($env{'form.sortby'} eq 'description') { - push(@{$Sortby{$grp_info{$group}{'description'}}}, - $group); + push(@{$Sortby{$grp_info{$group}{'description'}}},$group); } elsif ($env{'form.sortby'} eq 'creator') { push(@{$Sortby{$grp_info{$group}{'creator'}}},$group); } elsif ($env{'form.sortby'} eq 'creation') { @@ -235,13 +269,14 @@ END $rowColor = $rowColor2; } my $description = - &Apache::lonnet::unescape($grp_info{$group}{'description'}); + &unescape($grp_info{$group}{'description'}); my $creator = $grp_info{$group}{'creator'}; my $creation = $grp_info{$group}{'creation'}; my $modified = $grp_info{$group}{'modified'}; my $quota = $grp_info{$group}{'quota'}; my $totalmembers = $grp_info{$group}{'totalmembers'}; my $totalfiles = $grp_info{$group}{'totalfiles'}; + my $totaldirs = $grp_info{$group}{'totaldirs'}; my $boards = $grp_info{$group}{'boards'}; my $diskuse = $grp_info{$group}{'diskuse'}; my $functionality; @@ -267,7 +302,7 @@ END $group.'">'.$lt{'modify'}.''; } } - $r->print(''.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.$totalfiles.''.$boards.''.$diskuse.''); + $r->print(''.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.&mt('Files: ').$totalfiles.'
'.&mt('Folders: ').$totaldirs.'
'.$boards.''.$diskuse.''); $rowNum ++; } } @@ -287,7 +322,7 @@ END if ($manage_permission) { $r->print('

'.$lt{'crng'}.''); } else { - $r->print('

'.$lt{'crng'}); + $r->print('

'.$lt{'alth'}); } } @@ -300,7 +335,7 @@ END foreach my $group (@coursegroups) { my %group_info = &Apache::longroup::get_group_settings( $curr_groups{$group}); - my $description = &Apache::lonnet::unescape( + my $description = &unescape( $group_info{description}); my ($uname,$udom) = split(/:/,$group_info{creator}); $r->print(''.$group,'
'.$description.'

'); @@ -308,7 +343,8 @@ END } } else { $r->print(&mt('You are not currently a member of any '. - 'active groups in this course')); + 'active [_1]s in this [_2]',$gpterm, + lc($crstype))); } } return; @@ -316,7 +352,8 @@ END sub group_administration { my ($r,$action,$state,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$rowColor1,$rowColor2) = @_; + $view_permission,$manage_permission,$rowColor1,$rowColor2,$gpterm, + $ucgpterm,$crstype) = @_; my %sectioncount = (); my @tools = (); my @types = (); @@ -330,7 +367,8 @@ sub group_administration { my %memchg; my @member_changes = ('deletion','expire','activate','reenable', 'changefunc','changepriv'); - my ($groupname,$description,$startdate,$enddate,$granularity,$specificity); + my ($groupname,$description,$startdate,$enddate,$granularity,$specificity, + $quota); if (defined($env{'form.groupname'})) { $groupname = $env{'form.groupname'}; @@ -354,7 +392,9 @@ sub group_administration { if (defined($env{'form.specificity'})) { $specificity=$env{'form.specificity'}; } - + if (defined($env{'form.quota'})) { + $quota=$env{'form.quota'}; + } } if (($action eq 'create') || (($action eq 'modify') && (($state eq 'pick_privs') || ($state eq 'addresult')))) { @@ -393,6 +433,7 @@ sub group_administration { $description = $stored{'description'}; $granularity = $stored{'granularity'}; $specificity = $stored{'specificity'}; + $quota = $stored{'quota'}; } } } @@ -400,7 +441,7 @@ sub group_administration { my %toolprivs = ( email => { - sgm => 'Send group mail', + sgm => 'Send '.$gpterm.' mail', sgb => 'Broadcast mail', }, discussion => { @@ -416,7 +457,9 @@ sub group_administration { files => { rgf => 'Retrieve', ugf => 'Upload', + mgf => 'Modify', dgf => 'Delete', + agf => 'Control Access', }, roster => { vgm => 'View', @@ -455,6 +498,7 @@ sub group_administration { enddate_second => 'text', groupname => 'text', description => 'text', + quota => 'text', tool => 'checkbox', granularity => 'radio', no_end_date => 'checkbox', @@ -769,7 +813,8 @@ function changeSort(caller) { } my $loaditems = &onload_action($action,$state); - $r->print(&header('Course Groups Manager', + my $crumbtitle = "$crstype $ucgpterm".'s'; + $r->print(&header("$crumbtitle Manager", $jscript,$action,$state,$page,$function,$loaditems)); if ($env{'form.refpage'} eq 'enrl') { @@ -780,21 +825,21 @@ function changeSort(caller) { } else { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursegroups", - text=>"Course Groups", + text=>"$crumbtitle", faq=>9,bug=>'Instructor Interface',}); } my %trail = (); %{$trail{'create'}} = &Apache::lonlocal::texthash ( - pick_name => 'Group Settings', + pick_name => $ucgpterm.' Settings', pick_members => 'Select Members', pick_privs => 'Choose Privileges', result => 'Creation Complete', ); %{$trail{'modify'}} = &Apache::lonlocal::texthash( - pick_group => 'Groups', + pick_group => $ucgpterm.'s', pick_task => 'Choose Task', - change_settings => 'Group Settings', + change_settings => "$ucgpterm Settings", change_members => 'Modify/Delete Members', change_privs => 'Change Privileges', change_mapping => 'Membership Mapping', @@ -808,7 +853,7 @@ function changeSort(caller) { my %navbuttons = &Apache::lonlocal::texthash( gtns => 'Go to next step', gtps => 'Go to previous step', - crgr => 'Create group', + crgr => 'Create '.$gpterm, mose => 'Modify settings', gtpp => 'Go to previous page', adme => 'Add members', @@ -820,14 +865,15 @@ function changeSort(caller) { &Apache::lonhtmlcommon::add_breadcrumb( {text=>"$trail{$action}{$state}"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs - ('Course Groups Manager')); + ("$crumbtitle Manager")); &display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page, \%sectioncount,$groupname,$description,$functions, \@tools,\%toolprivs,\%fixedprivs,$startdate,$enddate, \%users,\%userdata,$idx,\%memchg,\%usertools, $function,$view_permission,$manage_permission, - \%stored,$granularity,$specificity,\@types,\@roles, - \@sections,\%states,\%navbuttons,$rowColor1,$rowColor2); + \%stored,$granularity,$quota,$specificity,\@types,\@roles, + \@sections,\%states,\%navbuttons,$rowColor1,$rowColor2, + $gpterm,$ucgpterm,$crstype); last; } else { if (($state eq 'result') && ($i > 0)) { @@ -843,12 +889,13 @@ function changeSort(caller) { } } elsif (($action eq 'view') && ($view_permission)) { &Apache::lonhtmlcommon::add_breadcrumb( - {text=>"View groups"}); + {text=>"View $gpterm".'s'}); + my $crumbtitle = "$crstype $ucgpterm".'s Manager'; $r->print(&Apache::lonhtmlcommon::breadcrumbs - ('Course Groups Manager')); + (&mt($crumbtitle))); &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); } $r->print(&footer()); @@ -867,7 +914,7 @@ sub retrieve_settings { my %stored; $stored{'description'} = - &Apache::lonnet::unescape($groupinfo{'description'}); + &unescape($groupinfo{'description'}); $stored{'startdate'} = $groupinfo{'startdate'}; $stored{'enddate'} = $groupinfo{'enddate'}; if ($stored{'enddate'} == 0) { @@ -877,6 +924,7 @@ sub retrieve_settings { $stored{'specificity'} = $groupinfo{'specificity'}; $stored{'creation'} = $groupinfo{'creation'}; $stored{'creator'} = $groupinfo{'creator'}; + $stored{'quota'} = $groupinfo{'quota'}; foreach my $tool (sort(keys(%{$groupinfo{'functions'}}))) { if ($groupinfo{functions}{$tool} eq 'on') { @@ -916,78 +964,86 @@ sub display_control { my ($r,$cdom,$cnum,$tabcol,$action,$state,$page,$sectioncount,$groupname, $description,$functions,$tools,$toolprivs,$fixedprivs,$startdate, $enddate,$users,$userdata,$idx,$memchg,$usertools,$function, - $view_permission,$manage_permission,$stored,$granularity,$specificity, - $types,$roles,$sections,$states,$navbuttons,$rowColor1,$rowColor2)=@_; + $view_permission,$manage_permission,$stored,$granularity,$quota, + $specificity,$types,$roles,$sections,$states,$navbuttons,$rowColor1, + $rowColor2,$gpterm,$ucgpterm,$crstype) = @_; if ($action eq 'create') { if ($state eq 'pick_name') { &general_settings_form($r,$cdom,$cnum,$action,$tabcol,$state,$page, $functions,$tools,$toolprivs,$fixedprivs, $sectioncount,$stored,$states,$navbuttons, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm, + $crstype); } elsif ($state eq 'pick_members') { &choose_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, - $groupname,$description,$granularity, + $groupname,$description,$granularity,$quota, $startdate,$enddate,$tools,$fixedprivs, $toolprivs,$functions,$users,$userdata,$idx, $stored,$states,$navbuttons,$rowColor1, - $rowColor2); + $rowColor2,$gpterm,$ucgpterm,$crstype); } elsif ($state eq 'pick_privs') { &choose_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, $startdate,$enddate,$tools,$functions, $toolprivs,$fixedprivs,$userdata,$usertools, $idx,$states,$stored,$sectioncount,$navbuttons, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm, + $crstype); } elsif ($state eq 'result') { &process_request($r,$cdom,$cnum,$tabcol,$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,$rowColor1,$rowColor2, + $gpterm,$ucgpterm,$crstype); } } elsif ($action eq 'modify') { my $groupname = $env{'form.groupname'}; if ($state eq 'pick_group') { &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); } elsif ($state eq 'pick_task') { - &modify_menu($r,$groupname,$page); + &modify_menu($r,$groupname,$page,$gpterm); } elsif ($state eq 'change_settings') { &general_settings_form($r,$cdom,$cnum,$action,$tabcol,$state,$page, $functions,$tools,$toolprivs,$fixedprivs, $sectioncount,$stored,$states,$navbuttons, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm, + $crstype); } elsif ($state eq 'change_members') { &change_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, $groupname,$description,$startdate,$enddate, $tools,$fixedprivs,$functions,$users, - $userdata,$granularity,$specificity,$idx, - $states,$navbuttons,$rowColor1,$rowColor2); + $userdata,$granularity,$quota,$specificity, + $idx,$states,$navbuttons,$rowColor1,$rowColor2, + $gpterm,$ucgpterm); } elsif ($state eq 'add_members') { &add_members_form($r,$tabcol,$action,$state,$page,$startdate, $enddate,$groupname,$description,$granularity, - $sectioncount,$tools,$functions,$stored,$states, - $navbuttons,$rowColor1,$rowColor2); + $quota,$sectioncount,$tools,$functions,$stored, + $states,$navbuttons,$rowColor1,$rowColor2,$gpterm, + $ucgpterm); } elsif ($state eq 'pick_members') { &choose_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, - $groupname,$description,$granularity, + $groupname,$description,$granularity,$quota, $startdate,$enddate,$tools,$fixedprivs, $toolprivs,$functions,$users,$userdata,$idx, $stored,$states,$navbuttons,$rowColor1, - $rowColor2); + $rowColor2,$gpterm,$ucgpterm,$crstype); } elsif ($state eq 'pick_privs') { &choose_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, $startdate,$enddate,$tools,$functions, $toolprivs,$fixedprivs,$userdata,$usertools, $idx,$states,$stored,$sectioncount,$navbuttons, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); } elsif ($state eq 'change_privs') { &change_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, $startdate,$enddate,$tools,$functions, $toolprivs,$fixedprivs,$userdata,$usertools, $memchg,$idx,$states,$stored,$sectioncount, - $navbuttons,$rowColor1,$rowColor2); + $navbuttons,$rowColor1,$rowColor2,$gpterm, + $ucgpterm); } elsif ($state eq 'chgresult' || $state eq 'memresult' || $state eq 'addresult') { &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page, @@ -995,7 +1051,8 @@ sub display_control { $startdate,$enddate,$tools,$functions, $toolprivs,$usertools,$idx,$types,$roles, $sections,$states,$navbuttons,$memchg, - $sectioncount,$stored,$rowColor1,$rowColor2); + $sectioncount,$stored,$rowColor1,$rowColor2, + $gpterm,$ucgpterm,$crstype); } } } @@ -1069,6 +1126,21 @@ sub build_members_list { } sub group_files { + my ($group,$currdir,$numfiles,$numdirs) = @_; + my $dirptr=16384; + my @dir_list=&Apache::portfolio::get_dir_list($currdir,$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; + $$numdirs ++; + &group_files($numfiles,$numdirs) + } else { + $$numfiles ++; + } + } + } return; } @@ -1081,7 +1153,6 @@ sub group_members { $$group_info{'totalmembers'} = 'Unknown - an error occurred'; return $tmp; } - my $now = time; my $totalmembers = 0; my $active = 0; my $previous = 0; @@ -1111,23 +1182,26 @@ sub group_members { sub general_settings_form { my ($r,$cdom,$cnum,$action,$tabcol,$formname,$page,$functions,$tools, $toolprivs,$fixedprivs,$sectioncount,$stored,$states,$navbuttons, - $rowColor1,$rowColor2) = @_; + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_; my ($nexttext,$prevtext); $r->print('
'); - &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1); + &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1, + $gpterm,$ucgpterm,$crstype); $r->print(' '); - &access_date_settings($r,$tabcol,$action,$formname,$stored,2); + &access_date_settings($r,$tabcol,$action,$formname,$stored,2,$gpterm, + $ucgpterm); $r->print(' '); if ($action eq 'create') { - &membership_options($r,$action,$formname,$tabcol,$sectioncount,3); + &membership_options($r,$action,$formname,$tabcol,$sectioncount,3, + $gpterm,$ucgpterm); $nexttext = $$navbuttons{'gtns'}; } else { my @available = (); @@ -1136,14 +1210,14 @@ sub general_settings_form { @{$tools} = sort(keys(%{$functions})); &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action, 3,$tools,$stored,$toolprivs,$fixedprivs, - \@available,$formname); + \@available,$formname,$gpterm,$ucgpterm); $r->print(' '); &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount, $states,$stored,$navbuttons,4,5,$rowColor1, - $rowColor2); + $rowColor2,$gpterm,$ucgpterm,$crstype); $nexttext = $$navbuttons{'mose'}; } $prevtext = $$navbuttons{'gtpp'}; @@ -1155,18 +1229,25 @@ sub general_settings_form { } sub groupsettings_options { - my ($r,$tabcol,$functions,$action,$formname,$stored,$image) = @_; + my ($r,$tabcol,$functions,$action,$formname,$stored,$image,$gpterm, + $ucgpterm,$crstype) = @_; my %lt = &Apache::lonlocal::texthash( - 'gdat' => 'Group open and close dates', - 'sten' => 'Set a start date/time and end date/time for the group', - 'gfun' => 'Group functionality', - 'gnde' => 'Group name, description and available functionality', + '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' => 'Group Name', - 'doyo' => 'Do you want to assign different functionality '. - 'to different group members?', + 'gnam' => "$ucgpterm Name", + 'doyo' => "Do you want to assign different functionality ". + "to different $gpterm members?", ); + my $crsquota = $env{'course.'.$env{'request.course.id'}.'.internal.coursequota'}; + if ($crsquota eq '') { + $crsquota = 20; + } + my $freespace = $crsquota - &Apache::longroup::sum_quotas(); + my $maxposs = $$stored{'quota'} + $freespace; &topic_bar($r,$tabcol,$image,$lt{'gnde'}); $r->print(' @@ -1227,8 +1308,8 @@ END - - + + + +
 
 
 
Granularity:'.$lt{'doyo'}.'  '); + '.&mt('Granularity:').''.$lt{'doyo'}.'  '); if ($action eq 'modify') { $r->print('  ('.&mt('Currently set to "[_1]"', $$stored{'granularity'}).')'); @@ -1236,6 +1317,30 @@ END $r->print('
'.&mt('Disk quota: ').''); + if ($action eq 'create') { + $r->print(&mt('If you enable the file repository for the [_1], allocate a disk quota.',$gpterm)); + } else { + $r->print(&mt('Quota allocated to file repository:')); + } + $r->print(' Mb'); + if ($action eq 'create') { + $r->print('
'. + &mt('A total of [_1] Mb is shared between all [_2]s in the '. + '[_3], and [_4] Mb are currently unallocated.',$crsquota, + $gpterm,lc($crstype),$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(' +
@@ -1244,20 +1349,21 @@ END } sub membership_options { - my ($r,$action,$state,$tabcol,$sectioncount,$image) = @_; + my ($r,$action,$state,$tabcol,$sectioncount,$image,$gpterm,$ucgpterm) = @_; + my $crstype = &Apache::loncommon::course_type(); my %lt = &Apache::lonlocal::texthash( 'pipa' => 'Pick parameters to generate membership list', - 'gmem' => 'Group membership options', + 'gmem' => "$ucgpterm membership options", 'picr' => 'Pick the criteria to use to build a list of '. - 'course users from which you will select ', - 'meof' => 'members of the new group.', - 'admg' => 'additional members of the group.', - 'ifno' => 'If you do not wish to add members when you first '. - 'create the group, do not make any selections.', - 'asub' => 'A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified role and section changes.', + lc($crstype).' users from which you will select ', + 'meof' => "members of the new $gpterm.", + 'admg' => "additional members of the $gpterm.", + '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.", 'acty' => 'Access types', - 'coro' => 'Course roles', - 'cose' => 'Course sections', + 'coro' => $crstype.' roles', + 'cose' => $crstype.' sections', ); my %status_types = ( active => &mt('Currently has access'), @@ -1265,7 +1371,8 @@ sub membership_options { future => &mt('Will have future access'), ); - my @roles = ('st','cc','in','ta','ep','cr'); + #FIXME need to plumb around for the various cr roles defined by the user + my @roles = ('st','cc','in','ta','ep'); my @sections = keys(%{$sectioncount}); @@ -1300,8 +1407,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,'none'); # Put 'no sections' next + unshift(@sections,'all'); # Put 'all' at the front of the list $r->print('  '. §ions_selection(\@sections,'sectionpick').''); @@ -1323,11 +1430,11 @@ sub sections_selection { } foreach my $sec (@{$sections}) { if ($sec eq 'all') { - $section_sel .= ' '."\n"; } elsif ($sec eq 'none') { - $section_sel .= ' '."\n"; } else { - $section_sel .= ' \n"; } } my $output = ' @@ -1338,9 +1445,9 @@ sub sections_selection { } sub access_date_settings { - my ($r,$tabcol,$action,$formname,$stored,$image) = @_; + my ($r,$tabcol,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_; my %lt = &Apache::lonlocal::texthash( - 'sten' => 'Default start and end dates for group access', + 'sten' => "Default start and end dates for $gpterm access", ); my $starttime = time; my $endtime = time+(6*30*24*60*60); # 6 months from now, approx @@ -1370,16 +1477,17 @@ sub access_date_settings { sub choose_members_form { my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$groupname,$description, - $granularity,$startdate,$enddate,$tools,$fixedprivs,$toolprivs, + $granularity,$quota,$startdate,$enddate,$tools,$fixedprivs,$toolprivs, $functions,$users,$userdata,$idx,$stored,$states,$navbuttons, - $rowColor1,$rowColor2) = @_; + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_; my @regexps = ('user_','userpriv_','sec_'); my %origmembers; $r->print(&Apache::lonhtmlcommon::echo_form_input( ['origin','action','state','page','member','specificity','branch', 'defpriv','autorole','autoadd','autodrop','sortby','togglefunc'], \@regexps)); - my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum); + my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm, + $ucgpterm,$crstype); $r->print(' @@ -1400,8 +1508,8 @@ sub choose_members_form { if ($action eq 'create') { &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2, $functions,$startdate,$enddate,$groupname, - $description,$granularity,\@available, - \@unavailable); + $description,$granularity,$quota,\@available, + \@unavailable,$gpterm,$ucgpterm); $specimg = 4; $memimg = 5; } else { @@ -1423,11 +1531,11 @@ sub choose_members_form { } &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action, $specimg,$tools,$stored,$toolprivs, - $fixedprivs,\@available,$formname); + $fixedprivs,\@available,$formname,$gpterm,$ucgpterm); my $newusers = &pick_new_members($r,$action,$formname,$tabcol,$rowColor1, $rowColor2,\@available,$idx,$stored, $memimg,$users,$userdata,$granularity, - \%origmembers); + \%origmembers,$gpterm,$ucgpterm); if ($newusers || $action eq 'create') { &display_navbuttons($r,$formname,$$states{$action}[$page-1], $$navbuttons{'gtps'},$$states{$action}[$page+1], @@ -1480,17 +1588,19 @@ sub check_tools { sub print_current_settings { my ($r,$action,$tabcol,$rowColor1,$rowColor2,$functions,$startdate,$enddate, - $groupname,$description,$granularity,$available,$unavailable) =@_; + $groupname,$description,$granularity,$quota,$available,$unavailable, + $gpterm,$ucgpterm) = @_; my %lt = &Apache::lonlocal::texthash( - grna => 'Group Name', + grna => "$ucgpterm Name", desc => 'Description', - grfn => 'Group Functions', + grfn => "$ucgpterm Functions", gran => 'Granularity', + quot => 'File quota', dfac => 'Default access dates', - ygrs => 'Your group selections', - tfwa => 'The following settings will apply to the group:', - difn => 'Different functionality
for different users:', + ygrs => "Your $gpterm selections", + tfwa => "The following settings will apply to the $gpterm:", + difn => 'Different functionality
for different members:', stda => 'Start date', enda => 'End date:', ); @@ -1521,6 +1631,7 @@ sub print_current_settings { + @@ -1567,7 +1678,8 @@ sub print_current_settings { $r->print(<<"END"); + @@ -1583,16 +1695,17 @@ END sub pick_new_members { my ($r,$action,$formname,$tabcol,$rowColor1,$rowColor2,$available,$idx, - $stored,$img,$users,$userdata,$granularity,$origmembers) = @_; + $stored,$img,$users,$userdata,$granularity,$origmembers,$gpterm, + $ucgpterm) = @_; my %lt = &Apache::lonlocal::texthash( - 'gpme' => 'Group membership', + 'gpme' => "$ucgpterm 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.', + '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.', @@ -1658,6 +1771,7 @@ sub pick_new_members { + '); if (@{$available} > 0) { $r->print(''); @@ -1686,6 +1800,8 @@ 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); } @@ -1703,10 +1819,12 @@ sub pick_new_members { my $fullname = $members{$user}[$$idx{fullname}]; my $udom = $members{$user}[$$idx{udom}]; my $uname = $members{$user}[$$idx{uname}]; + my $section = $members{$user}[$$idx{section}]; $r->print(''); + $udom.''. + ''); if (@{$available} > 0) { $r->print(''); &topic_bar($r,$tabcol,2,$lt{'mogm'}); @@ -2115,7 +2234,7 @@ sub current_membership { my $addtools = 0; my $num_reenable = 0; my $num_activate = 0; - my $num_expire - 0; + my $num_expire = 0; foreach my $key (sort(keys(%membership))) { if ($key =~ /^\Q$groupname\E:([^:]+):([^:]+)$/) { my $uname = $1; @@ -2412,13 +2531,13 @@ 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) = @_; + $rowColor2,$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)); @@ -2457,12 +2576,13 @@ sub change_privs_form { ''); } - &topic_bar($r,$tabcol,4,&mt('Group member privileges')); + &topic_bar($r,$tabcol,4,&mt('[_1] member privileges',$ucgpterm)); my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools, $toolprivs,$fixedprivs,$userdata, $usertools,$idx,$memchg,$states, - $stored,$rowColor1,$rowColor2); + $stored,$rowColor1,$rowColor2, + $gpterm); $r->print(''); my $prevtext = $$navbuttons{'gtps'}; if ($numchgs || $exp_or_del) { @@ -2477,8 +2597,8 @@ sub change_privs_form { sub add_members_form { my ($r,$tabcol,$action,$formname,$page,$startdate,$enddate,$groupname, - $description,$granularity,$sectioncount,$tools,$functions,$stored, - $states,$navbuttons,$rowColor1,$rowColor2) = @_; + $description,$granularity,$quota,$sectioncount,$tools,$functions, + $stored,$states,$navbuttons,$rowColor1,$rowColor2,$gpterm,$ucgpterm)=@_; $r->print('
'.$lt{'desc'}.' '.$lt{'grfn'}.' '.$lt{'gran'}.''.$lt{'quot'}.' '.$lt{'dfac'}.'
$lt{'difn'} - $granularity + $granularity$quota Mb $lt{'stda'} $showstart
$lt{'enda'} $showend
'.&mt('Domain').' IDSection'.$lt{'func'}.'
'. $fullname.''.$uname.''. - $udom.''.$id.''.$id.''.$section.''. '       '); @@ -1749,7 +1867,7 @@ sub pick_new_members { sub privilege_specificity { my ($r,$tabcol,$rowColor1,$rowColor2,$action,$img,$tools,$stored, - $toolprivs,$fixedprivs,$available,$formname) = @_; + $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, '. @@ -1764,19 +1882,19 @@ sub privilege_specificity { 'privileges which apply to members with access to that '. 'functionality, and may also include 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, '. - '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.', + '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.", + '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.', 'oppr' => 'Optional privileges', @@ -2041,11 +2159,11 @@ sub display_defprivs { sub change_members_form { my ($r,$cdom,$cnum,$tabcol,$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,$rowColor1, + $rowColor2,$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( @@ -2070,7 +2188,8 @@ sub change_members_form { '); &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2, $functions,$startdate,$enddate,$groupname, - $description,$granularity,\@available,\@unavailable); + $description,$granularity,$quota,\@available, + \@unavailable,$gpterm,$ucgpterm); $r->print('
 
 
 
@@ -2490,7 +2610,8 @@ sub add_members_form { &check_tools($functions,$tools,\@available,\@unavailable); &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2, $functions,$startdate,$enddate,$groupname, - $description,$granularity,\@available,\@unavailable); + $description,$granularity,$quota,\@available, + \@unavailable,$gpterm,$ucgpterm); $r->print(' @@ -2498,7 +2619,8 @@ sub add_members_form { '); - &membership_options($r,$action,$formname,$tabcol,$sectioncount,1); + &membership_options($r,$action,$formname,$tabcol,$sectioncount,1,$gpterm, + $ucgpterm); my $nexttext = $$navbuttons{'gtns'}; my $prevtext = $$navbuttons{'gtpp'}; &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, @@ -2511,7 +2633,8 @@ sub add_members_form { 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) = @_; + $states,$stored,$sectioncount,$navbuttons,$rowColor1,$rowColor2, + $gpterm,$ucgpterm,$crstype) = @_; my @regexps = ('userpriv_'); my $nexttext; @@ -2529,11 +2652,11 @@ sub choose_privs_form { } $r->print('
 
'); - &topic_bar($r,$tabcol,6,&mt('Group member privileges')); + &topic_bar($r,$tabcol,6,&mt('[_1] member privileges',$ucgpterm)); &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs, $fixedprivs,$userdata,$usertools,$idx,undef, - $states,$stored,$rowColor1,$rowColor2); + $states,$stored,$rowColor1,$rowColor2,$gpterm); $r->print(''); if ($action eq 'create') { @@ -2542,7 +2665,7 @@ sub choose_privs_form { my $img2 = 8; &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount, $states,$stored,$navbuttons,$img1,$img2, - $rowColor1,$rowColor2); + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); } } my $prevtext = $$navbuttons{'gtps'}; @@ -2612,7 +2735,8 @@ function uncheckAllTools(formname) { sub member_privileges_form { my ($r,$tabcol,$action,$formname,$tools,$toolprivs,$fixedprivs,$userdata, - $usertools,$idx,$memchg,$states,$stored,$rowColor1,$rowColor2) = @_; + $usertools,$idx,$memchg,$states,$stored,$rowColor1,$rowColor2, + $gpterm) = @_; my %lt = &Apache::lonlocal::texthash( 'addp' => 'Additional privileges', 'fixp' => 'Fixed privileges', @@ -2621,15 +2745,15 @@ sub member_privileges_form { '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.', - '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 '. - 'functionality for any current members ', + '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 ", 'full' => 'Fullname', 'user' => 'Username', 'doma' => 'Domain', @@ -2788,12 +2912,14 @@ sub process_request { my ($r,$cdom,$cnum,$tabcol,$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,$rowColor1,$rowColor2,$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('
 
@@ -2839,13 +2965,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; } @@ -2853,7 +2981,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'}; @@ -2861,10 +2989,10 @@ sub write_group_data { $creation = $$stored{'creation'}; $creator = $$stored{'creator'}; } - my $esc_description = &Apache::lonnet::escape($description); + my $esc_description = &escape($description); my @single_attributes = ('description','functions','startdate','enddate', 'creation','modified','creator','granularity', - 'specificity','autoadd','autodrop'); + 'specificity','autoadd','autodrop','quota'); my @mult_attributes = ('roles','types','sectionpick','defpriv'); my %groupinfo = ( @@ -2878,6 +3006,7 @@ sub write_group_data { specificity => $specificity, autoadd => $env{'form.autoadd'}, autodrop => $env{'form.autodrop'}, + quota => $env{'form.quota'}, ); foreach my $func (keys(%{$functions})) { my $status; @@ -2925,28 +3054,34 @@ 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.
'); + 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)); } else { - $r->print('Group '.$groupname.' was updated.
'); + $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 new [_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 = (); @@ -2974,7 +3109,7 @@ sub process_membership { } } else { if (@{$defprivs} > 0) { - foreach my $priv (@{$defprivs}) { + if (grep/^\Q$priv\E$/,@{$defprivs}) { foreach my $user (sort(keys(%{$usertools}))) { if ($$usertools{$user}{$tool}) { $group_privs{$user} .= $priv.':'; @@ -3143,30 +3278,32 @@ 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("For full access to all of [_1]'s privileges, users will need to log out and log back in.",$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) = @_; + $navbuttons,$img1,$img2,$rowColor1,$rowColor2,$gpterm,$ucgpterm, + $crstype) = @_; 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 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(' @@ -3174,7 +3311,7 @@ sub mapping_options { '); &mapping_settings($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,\%lt, - $stored,$img2); + $stored,$img2,$crstype); return; } @@ -3234,7 +3371,8 @@ sub automapping { } sub mapping_settings { - my ($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,$lt,$stored,$image) = @_; + my ($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,$lt,$stored,$image, + $crstype) = @_; my @sections = keys(%{$sectioncount}); if (@sections > 0) { @sections = sort {$a cmp $b} @sections; @@ -3260,7 +3398,7 @@ sub mapping_settings { my $rowNum = 0; my $rowColor; foreach my $role (@roles) { - my $plrole=&Apache::lonnet::plaintext($role); + my $plrole=&Apache::lonnet::plaintext($role,$crstype); my $sections_sel; if (@sections > 0) { if ($role eq 'cc') { @@ -3320,10 +3458,10 @@ sub my_custom_roles { } 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', @@ -3334,7 +3472,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', @@ -3447,21 +3585,172 @@ sub date_setting_table { return ($start_table, $end_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.'default_0.sequence'; + my $topmap = $navmap->getResourceByUrl($allgrpsmap); + undef($navmap); + if ($action eq 'create') { + # check if default_0.sequence exists. + if (!$topmap) { + my $grpstitle = &mt('[_1] [_2]',$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,'default_0.sequence', + 'toplevelgroup',$grpstitle,$topmap_url); + if ($outcome ne 'ok') { + return $outcome; + } + } else { + $outcome = &mt('Non-standard course - group folder not added.'); + return $outcome; + } + } + my $grpfolder = &mt('[_1] Folder -',$ucgpterm,).$description; + $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/grppg'; + my $grptitle = &mt('Group homepage').' - '.$description; + my ($seqid,$discussions,$disctitle); + my $outcome = &map_updater($cdom,$cnum,'default_'.$now.'.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.'default_'.$now.'.sequence'; + if (grep/^discussion$/,@{$tools}) { + $seqid = $now + 1; + $disctitle = &mt('Discussion Boards'); + my $outcome = &map_updater($cdom,$cnum,'default_'.$seqid. + '.sequence','bbseq',$disctitle,$grpmap); + if ($outcome ne 'ok') { + return $outcome; + } + $boardsmap = $crspath.'default_'.$seqid.'.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 ($allgrpsmap) { + $parm_result .= &parm_setter($navmap,$cdom,$allgrpsmap,$groupname); + } + 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 = "Error uploading new folder ($newfile): $newmapurl"; + return $outcome; + } + my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap); + if ($fatal) { + $outcome = "Error reading contents of parent folder ($parentmap): $errtext\n"; + return $outcome; + } else { + my $newidx=&Apache::lonratedt::getresidx($newmapurl); + $Apache::lonratedt::resources[$newidx] = $itemtitle.':'.$newmapurl. + ':false:normal:res'; + $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx; + my ($outtext,$errtext) = &Apache::lonratedt::storemap($parentmap,1); + if ($errtext) { + $outcome = "Error storing updated parent folder ($parentmap): $errtext\n"; + 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 %parmresult; + 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)) { + $parmresult{$level} = &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'}); + } + return %parmresult; +} + sub create_homepage { - my ($cdom,$cnum,$name,$groupinfo,$tools) = @_; + my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm,$now) = @_; my $functionality = join(',',@{$tools}); - my $content = &Apache::lonnet::unescape($$groupinfo{description}); + my $content = &unescape($$groupinfo{description}); $content=~s/\s+$//s; $content=~s/^\s+//s; $content=~s/\$//s; $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; @@ -3503,22 +3792,22 @@ 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 %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'}.' "'. @@ -3536,12 +3825,13 @@ sub validate_groupname { if ($action eq 'create' && exists($curr_groups{$groupname})) { - return $exitmsg.$lt{'cnnb'}.&mt('an existing group'). + return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$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; } }