--- loncom/interface/loncoursegroups.pm 2006/05/25 22:39:59 1.22 +++ loncom/interface/loncoursegroups.pm 2006/07/07 17:11:04 1.41 @@ -1,3 +1,6 @@ +# The LearningOnline Network with CAPA +# +# $Id: loncoursegroups.pm,v 1.41 2006/07/07 17:11:04 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,44 @@ 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); + &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,$view_permission, + $manage_permission,$action,$state,$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) = @_; + my ($r,$cdom,$cnum,$functions,$idx,$view_permission,$manage_permission, + $action,$state,$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, - undef,$function)); + $r->print(&header($pagename,$jscript,$action,$state)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursegroups", - text=>"Course Groups",}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Groups')); - &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2); + text=>"$pagename"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename)); + &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$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) = @_; + my ($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm,$crstype) = @_; my %curr_groups = (); my %grp_info = (); my %actionlinks = ( @@ -144,7 +157,7 @@ sub display_groups { view => 'View', delete => 'Delete', act => 'Action', - gname => 'Group Name', + gname => "$ucgpterm Name", desc => 'Description', crea => 'Creator', crtd => 'Created', @@ -154,13 +167,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,29 +181,28 @@ 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(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); + $r->print(<<"END"); - - - - - - - - - - - - - - - + + + + + + + + + + + END + $r->print(&Apache::loncommon::end_data_table_header_row()); my %Sortby = (); foreach my $group (sort(keys(%curr_groups))) { %{$grp_info{$group}} = @@ -198,12 +210,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') { @@ -225,23 +252,17 @@ END push(@{$Sortby{$group}},$group); } } - my $rowNum = 0; - my $rowColor; foreach my $key (sort(keys(%Sortby))) { foreach my $group (@{$Sortby{$key}}) { - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $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,12 +288,23 @@ END $group.'">'.$lt{'modify'}.''; } } - $r->print(''); - $rowNum ++; + $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense'). + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + &Apache::loncommon::end_data_table_row()); } } - $r->print('
$lt{'act'}$lt{'gname'}$lt{'desc'}$lt{'crea'} - $lt{'crtd'} - $lt{'last'} - $lt{'func'} - $lt{'quot'}$lt{'memb'}$lt{'file'}$lt{'dibd'}$lt{'dius'}
$lt{'act'}$lt{'gname'}$lt{'desc'}$lt{'crea'}$lt{'crtd'}$lt{'last'}$lt{'func'} + $lt{'quot'}$lt{'memb'}$lt{'file'}$lt{'dibd'}$lt{'dius'}
'.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.$totalfiles.''.$boards.''.$diskuse.'
'.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.&mt('Files: ').$totalfiles.'
'.&mt('Folders: ').$totaldirs.'
'.$boards.''.$diskuse.'
'); - $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(&Apache::loncommon::end_data_table()); $r->print(''); if ($action eq 'view') { @@ -287,7 +319,7 @@ END if ($manage_permission) { $r->print('

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

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

'.$lt{'alth'}); } } @@ -300,7 +332,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 +340,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 +349,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 +364,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,$validate_script); if (defined($env{'form.groupname'})) { $groupname = $env{'form.groupname'}; @@ -354,7 +389,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,49 +430,14 @@ sub group_administration { $description = $stored{'description'}; $granularity = $stored{'granularity'}; $specificity = $stored{'specificity'}; + $quota = $stored{'quota'}; } } } - my %toolprivs = - ( - email => { - sgm => 'Send group mail', - sgb => 'Broadcast mail', - }, - discussion => { - cgb => 'Create boards', - pgd => 'Post', - pag => 'Anon. posts', - rgi => 'Get identities', - vgb => 'View boards', - }, - chat => { - pgc => 'Chat', - }, - files => { - rgf => 'Retrieve', - ugf => 'Upload', - dgf => 'Delete', - }, - roster => { - vgm => 'View', - }, - homepage => { - vgh => 'View page', - mgh => 'Modify page', - }, - ); + my $toolprivs = &Apache::longroup::get_tool_privs($gpterm); - my %fixedprivs = - ( - email => {sgm => 1}, - discussion => {vgb => 1}, - chat => {pgc => 1}, - files => {rgf => 1}, - roster => {vgm => 1}, - homepage => {vgh => 1}, - ); + my $fixedprivs = &Apache::longroup::get_fixed_privs(); my %elements = ( @@ -455,6 +457,7 @@ sub group_administration { enddate_second => 'text', groupname => 'text', description => 'text', + quota => 'text', tool => 'checkbox', granularity => 'radio', no_end_date => 'checkbox', @@ -642,8 +645,8 @@ sub group_administration { } my @currtools = (); if (@userprivs > 0) { - foreach my $tool (sort(keys(%fixedprivs))) { - foreach my $priv (keys(%{$fixedprivs{$tool}})) { + foreach my $tool (sort(keys(%{$fixedprivs}))) { + foreach my $priv (keys(%{$$fixedprivs{$tool}})) { if (grep/^$priv$/,@userprivs) { push(@currtools,$tool); last; @@ -713,19 +716,59 @@ sub group_administration { && ($specificity eq 'Yes')) { foreach my $user (sort(keys(%usertools))) { foreach my $tool (keys(%{$usertools{$user}})) { - foreach my $priv (keys(%{$toolprivs{$tool}})) { - unless (exists($fixedprivs{$tool}{$priv})) { + foreach my $priv (keys(%{$$toolprivs{$tool}})) { + unless (exists($$fixedprivs{$tool}{$priv})) { $elements{$action}{$state}{'userpriv_'.$priv} = 'checkbox'; } } } } } - + + if (($action eq 'create' && $state eq 'pick_name') || + ($action eq 'modify' && $state eq 'change_settings')) { + my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,\%stored); + my $space_trim = '/^\s*|\s*\$/g,""'; + my $float_check = '/^([0-9]*\.?[0-9]*)$/'; + $validate_script = ' + var newquota = document.'.$state.'.quota.value; + newquota.replace('.$space_trim.'); + if (newquota == "" ) { + document.'.$state.'.quota.value = 0; + newquota = 0; + } + var maxposs = '.$maxposs.'; + if (newquota > maxposs) { + alert("The file repository quota you entered for this group ("+newquota+" Mb) exceeds the maximum possible ("+maxposs+" Mb). Please enter a smaller number."); + return; + } + var re_quota = '.$float_check.'; + var check_quota = newquota.match(re_quota); + if (check_quota == null) { + alert("The quota you entered contains invalid characters, the quota should only include numbers, with or without a decimal point."); + return; + } + if (newquota == 0) { + var warn_zero = 0; + for (var i=0; iprint(&header('Course Groups Manager', - $jscript,$action,$state,$page,$function,$loaditems)); + my $crumbtitle = "$crstype $ucgpterm".'s'; + $r->print(&header("$crumbtitle Manager", + $jscript,$action,$state,$page,$loaditems)); if ($env{'form.refpage'} eq 'enrl') { &Apache::lonhtmlcommon::add_breadcrumb @@ -780,21 +824,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 +852,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 +864,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, + \@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 +888,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')); - &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2); + (&mt($crumbtitle))); + &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm, + $crstype); } $r->print(&footer()); @@ -867,7 +913,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 +923,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 +963,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); + &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$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,19 +1050,19 @@ 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); } } } sub header { - my ($bodytitle,$jscript,$action,$state,$page,$function,$loaditems) = @_; + my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_; my $start_page= &Apache::loncommon::start_page($bodytitle, '', - {'function' => $function, - 'add_entries' => $loaditems,}); + {'add_entries' => $loaditems,}); my $output = <<"END"; $start_page
@@ -1069,6 +1124,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 +1151,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 +1180,14 @@ 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); - $r->print(' - - - '); - &access_date_settings($r,$tabcol,$action,$formname,$stored,2); - $r->print(' - - - '); + &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1, + $gpterm,$ucgpterm,$crstype); + &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm); if ($action eq 'create') { - &membership_options($r,$action,$formname,$tabcol,$sectioncount,3); + &membership_options($r,$action,$formname,$sectioncount,3,$gpterm, + $ucgpterm); $nexttext = $$navbuttons{'gtns'}; } else { my @available = (); @@ -1136,42 +1196,35 @@ sub general_settings_form { @{$tools} = sort(keys(%{$functions})); &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action, 3,$tools,$stored,$toolprivs,$fixedprivs, - \@available,$formname); - $r->print(' - - - '); + \@available,$formname,$gpterm,$ucgpterm); &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'}; &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, $$states{$action}[$page+1],$nexttext); - $r->print(' -
 
 
 
'); return; } 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?", ); - &topic_bar($r,$tabcol,$image,$lt{'gnde'}); + my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored); + &topic_bar($r,$image,$lt{'gnde'}); $r->print(' - -   - @@ -1227,8 +1280,8 @@ END - - + + + +
'.$lt{'gnam'}.':
Granularity:'.$lt{'doyo'}.'  '); + '.&mt('Granularity:').''.$lt{'doyo'}.'  '); if ($action eq 'modify') { $r->print('  ('.&mt('Currently set to "[_1]"', $$stored{'granularity'}).')'); @@ -1236,28 +1289,67 @@ 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(' +
- - '); return; } +sub get_quota_constraints { + my ($action,$stored) = @_; + my ($crsquota,$freespace,$maxposs); + $crsquota = $env{'course.'.$env{'request.course.id'}.'.internal.coursequota'}; + if ($crsquota eq '') { + $crsquota = 20; + } + $freespace = $crsquota - &Apache::longroup::sum_quotas(); + if ($action eq 'create') { + $maxposs = $freespace; + } else { + $maxposs = $$stored{'quota'} + $freespace; + } + return ($crsquota,$freespace,$maxposs); +} + sub membership_options { - my ($r,$action,$state,$tabcol,$sectioncount,$image) = @_; + my ($r,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm) = @_; + my $crstype = &Apache::loncommon::course_type(); my %lt = &Apache::lonlocal::texthash( 'pipa' => 'Pick parameters to generate membership list', - 'gmem' => '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,16 +1357,14 @@ 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}); - &topic_bar($r,$tabcol,$image,$lt{'pipa'}); + &topic_bar($r,$image,$lt{'pipa'}); $r->print(' - -   - - '.$lt{'gmem'}.'
'.$lt{'picr'}); + '.$lt{'gmem'}.'
'.$lt{'picr'}); if ($action eq 'create') { $r->print($lt{'meof'}.'
'.$lt{'ifno'}.'
'.$lt{'asub'}); } else { @@ -1283,34 +1373,28 @@ sub membership_options { $r->print('

- +
- - - '); + + '); if (@sections >0) { $r->print(' - - - '); + '); } - $r->print(''); + $r->print(''); + $r->print(' - '); } $r->print(' -
'.$lt{'acty'}.' '.$lt{'coro'}.''.$lt{'acty'}.''.$lt{'coro'}.' '.$lt{'cose'}.' '.$lt{'cose'}.'
'); $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types)); - $r->print(' '); $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 - $r->print(' '. + unshift(@sections,'all'); # Put 'all' at the front of the list + $r->print(''. §ions_selection(\@sections,'sectionpick').'
- - '); + '); return; } @@ -1323,11 +1407,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 +1422,9 @@ sub sections_selection { } sub access_date_settings { - my ($r,$tabcol,$action,$formname,$stored,$image) = @_; + my ($r,$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 @@ -1350,47 +1434,30 @@ sub access_date_settings { $endtime = $$stored{'enddate'}; } } - my ($start_table,$end_table) = &date_setting_table - ($starttime,$endtime,$formname); - &topic_bar($r,$tabcol,$image,$lt{'sten'}); + my ($table) = &date_setting_table($starttime,$endtime,$formname); + &topic_bar($r,$image,$lt{'sten'}); $r->print(' - -   - '.$start_table.' - - -   - - -   - '.$end_table.' - '); + '.$table.' + '); return; } 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); - $r->print(' - - - - '); &display_navbuttons($r,$formname,$$states{$action}[$page-1], $$navbuttons{'gtps'}); - $r->print('
  -'); + my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm, + $ucgpterm,$crstype); if ($earlyout) { - $r->print($earlyout.'
'); return; } my ($specimg,$memimg); @@ -1398,10 +1465,9 @@ sub choose_members_form { my @unavailable = (); &check_tools($functions,$tools,\@available,\@unavailable); if ($action eq 'create') { - &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2, - $functions,$startdate,$enddate,$groupname, - $description,$granularity,\@available, - \@unavailable); + &print_current_settings($r,$action,$functions,$startdate,$enddate, + $groupname,$description,$granularity,$quota, + \@available,\@unavailable,$gpterm,$ucgpterm); $specimg = 4; $memimg = 5; } else { @@ -1423,11 +1489,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], @@ -1436,19 +1502,11 @@ sub choose_members_form { &display_navbuttons($r,$formname,$$states{$action}[$page-1], $$navbuttons{'gtps'}); } - $r->print(''); return; } sub display_navbuttons { my ($r,$formname,$prev,$prevtext,$next,$nexttext) = @_; - $r->print(' - -   - - -   - '); if ($prev) { $r->print(' '); } - $r->print(' - - -'); } sub check_tools { @@ -1479,18 +1533,19 @@ sub check_tools { } sub print_current_settings { - my ($r,$action,$tabcol,$rowColor1,$rowColor2,$functions,$startdate,$enddate, - $groupname,$description,$granularity,$available,$unavailable) =@_; + my ($r,$action,$functions,$startdate,$enddate,$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:', ); @@ -1501,35 +1556,31 @@ sub print_current_settings { } else { $showend = &Apache::lonlocal::locallocaltime($enddate); } - $r->print(''); if ($action eq 'create') { $r->print(' - - -'); +'); } - $r->print(' - @@ -1658,6 +1706,7 @@ sub pick_new_members { + '); if (@{$available} > 0) { $r->print(''); @@ -1666,7 +1715,7 @@ sub pick_new_members { if (@{$available} > 0) { if ($granularity eq 'Yes') { $r->print(' - + '); + $udom.''. + ''); if (@{$available} > 0) { $r->print(' - - - - - - '); +

+
+'); } else { $r->print(''); } if ($totaloptionalprivs) { - $r->print(' - - - - - - - - - - - - -'); return; } @@ -1902,12 +1930,9 @@ sub default_privileges { 'oppr' => 'Optional privileges', 'func' => 'Function', ); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); - $r->print(' - - - - - - - - - +
+   + '.$title.' +
'); return; }
'.$lt{'ygrs'}.' +
'.$lt{'ygrs'}.'
'.$lt{'tfwa'}.' -
'); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::loncommon::start_data_table('LC_course_group_status'). + &Apache::loncommon::start_data_table_header_row()); $r->print(' -
- - - - - - - - - - - + + + + + + +'); + $r->print(&Apache::loncommon::end_data_table_header_row(). + &Apache::loncommon::start_data_table_row('LC_data_table_dense')); + $r->print(' + + - END - $r->print(&Apache::lonhtmlcommon::end_pick_box()); - $r->print('
'.$lt{'grna'}.''.$lt{'desc'}.''.$lt{'grfn'}.''.$lt{'gran'}.''.$lt{'dfac'}.'
'.$groupname.''.$description.''.$lt{'grna'}.''.$lt{'desc'}.''.$lt{'grfn'}.''.$lt{'gran'}.''.$lt{'quot'}.''.$lt{'dfac'}.''.$groupname.''.$description.' '); if (@{$available} > 0) { - $r->print('Available: + $r->print('Available: '); my $rowcell = int(@{$available}/2) + @{$available}%2; for (my $i=0; $i<@{$available}; $i++) { @@ -1538,8 +1589,8 @@ sub print_current_settings { $r->print(''); } } - $r->print(''); + $r->print(''); } if ((@{$available} > 3) && (@{$available}%2)) { $r->print(''); @@ -1547,7 +1598,7 @@ sub print_current_settings { $r->print('
'.$$functions{$$available[$i]}. - ' '.$$functions{$$available[$i]}. + '   

'); } if (@{$unavailable} > 0) { - $r->print('Unavailable: + $r->print('Unavailable: '); my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2; for (my $j=0; $j<@{$unavailable}; $j++) { @@ -1556,8 +1607,8 @@ sub print_current_settings { $r->print(''); } } - $r->print(''); + $r->print(''); } if ((@{$unavailable} > 3) && (@{$unavailable}%2)) { $r->print(''); @@ -1566,33 +1617,30 @@ sub print_current_settings { } $r->print(<<"END"); - + + - -
'.$$functions{$$unavailable[$j]}. - ' '.$$functions{$$unavailable[$j]}. + '   $lt{'difn'} - $granularity - $lt{'stda'} $showstart
- $lt{'enda'} $showend
+
$lt{'difn'} $granularity$quota Mb$lt{'stda'} $showstart
+ $lt{'enda'} $showend
-

'); + $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) = @_; + $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.', @@ -1619,7 +1667,7 @@ 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('
'.&mt('Domain').' IDSection'.$lt{'func'}.'
   '.&mt('All:').' '); foreach my $tool (@{$available}) { $r->print('
'. $fullname.''.$uname.''. - $udom.''.$id.''.$id.''.$section.''. '       '); @@ -1749,7 +1802,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 +1817,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', @@ -1790,12 +1843,7 @@ 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'))) { my %specific = ( @@ -1821,21 +1869,14 @@ sub privilege_specificity { } if ($totaloptionalprivs) { $r->print(' -


- -
 
 '.$lt{'plin'}); + $r->print($lt{'plin'}); if ($action eq 'create') { $r->print(' '.$lt{'thwi'}); } @@ -1846,24 +1887,15 @@ 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); @@ -1886,10 +1918,6 @@ sub privilege_specificity { $toolprivs,\@defprivs); } } - $r->print(' -
- - - + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); + $r->print(' @@ -2041,11 +2066,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( @@ -2062,18 +2087,18 @@ sub change_members_form {
'.$lt{'func'}.''.$lt{'func'}.'
'.$lt{'fixp'}.'
'); - &topic_bar($r,$tabcol,1,$lt{'grse'}); + &topic_bar($r,1,$lt{'grse'}); $r->print(' '); - &topic_bar($r,$tabcol,2,$lt{'mogm'}); + &topic_bar($r,2,$lt{'mogm'}); $r->print(' @@ -2108,114 +2133,33 @@ sub current_membership { 'curf' => 'Current Functionality', '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,$hastools,$addtools,$num_reenable,$num_activate,$num_expire) = + &Apache::longroup::group_memberlist($cdom,$cnum,$groupname,$fixedprivs, + $available); + if (keys(%{$current}) > 0) { + $r->print(' @@ -2243,8 +2187,8 @@ sub current_membership { '."\n". + "
  '); - &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2, - $functions,$startdate,$enddate,$groupname, - $description,$granularity,\@available,\@unavailable); + &print_current_settings($r,$action,$functions,$startdate,$enddate, + $groupname,$description,$granularity,$quota, + \@available,\@unavailable,$gpterm,$ucgpterm); $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_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'}); + } + &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(' '); - } } - $r->print(<<"END"); + } + $r->print(<<"END");
'.$lt{'curf'}.' @@ -2228,9 +2172,9 @@ sub current_membership {
  END - $r->print(&Apache::lonhtmlcommon::start_pick_box()); - $r->print(<<"END"); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(<<"END"); @@ -2256,135 +2200,134 @@ END END - my $colspan = 0; - if ($hastools) { - $r->print(''); - $colspan ++; - } - if ($addtools) { - $r->print(''); - $colspan ++; - } - $r->print(''); - if ($colspan) { - if ($granularity eq 'Yes') { - $r->print(' + my $colspan = 0; + if ($hastools) { + $r->print(''); + $colspan ++; + } + if ($addtools) { + $r->print(''); + $colspan ++; + } + $r->print(''); + if ($colspan) { + if ($granularity eq 'Yes') { + $r->print(''); } + $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); + } + 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 { - push(@{$Sortby{$current{$user}{fullname}}},$user); + $rowColor = $rowColor2; } - } - 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 ($hastools) { - $r->print(''); + } + $r->print('   '); } - if ($addtools) { - $r->print(''); + } + if ($addtools) { + $r->print(''); } - $r->print(''."\n"); - $rowNum ++; + $r->print(''); } + $r->print(''."\n"); + $rowNum ++; } - $r->print(&Apache::lonhtmlcommon::end_pick_box()); - $r->print(' + } + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(' '); - } } return; } @@ -2412,13 +2355,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)); @@ -2428,7 +2371,7 @@ sub change_privs_form { $nexttext = $$navbuttons{'mose'}; } $r->print('
$lt{'actn'}$lt{'stda'} $lt{'enda'}'.$lt{'curf'}.'Additional Functionality
'.$lt{'curf'}.'Additional Functionality
  '.&mt('All:'). ' '); - foreach my $tool (@{$available}) { - $r->print('
'); - if ($current{$user}{changestate} eq 'reenable') { - $r->print('
'); + if ($$current{$user}{changestate} eq 'reenable') { + $r->print('
'); - } elsif ($current{$user}{changestate} eq 'expire') { - $r->print('
'); - } elsif ($current{$user}{changestate} eq 'activate') { - $r->print('
'); - } - $r->print(''); - if ($specificity eq 'Yes') { - $r->print('
'); - } - $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(''); - if ($granularity eq 'Yes') { - foreach my $tool (@{$current{$user}{newtools}}) { - $r->print(''); + if ($granularity eq 'Yes') { + foreach my $tool (@{$$current{$user}{newtools}}) { + $r->print('   '); - } - } else { - foreach my $tool (@{$current{$user}{newtools}}) { - $r->print('print(''.$tool. '   '); - } } - $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) { @@ -2457,12 +2400,13 @@ sub change_privs_form { ''); } - &topic_bar($r,$tabcol,4,&mt('Group member privileges')); + &topic_bar($r,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,41 +2421,28 @@ 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) = @_; - $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,$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(' -
  -'); + $description,$granularity,$quota,$sectioncount,$tools,$functions, + $stored,$states,$navbuttons,$rowColor1,$rowColor2,$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(' -
 
'); 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) = @_; + $states,$stored,$sectioncount,$navbuttons,$rowColor1,$rowColor2, + $gpterm,$ucgpterm,$crstype) = @_; my @regexps = ('userpriv_'); my $nexttext; @@ -2529,11 +2460,11 @@ sub choose_privs_form { } $r->print('
'); - &topic_bar($r,$tabcol,6,&mt('Group member privileges')); + &topic_bar($r,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 +2473,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 +2543,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 +2553,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 +2720,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 +2773,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 +2789,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,12 +2797,28 @@ 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 ($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,$maxposs)); + } my %groupinfo = ( description => $esc_description, startdate => $startdate, @@ -2878,7 +2830,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})) { @@ -2925,28 +2879,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 [_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 +2934,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.':'; @@ -3057,17 +3017,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; @@ -3082,6 +3031,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'; } @@ -3143,30 +3105,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 +3138,7 @@ sub mapping_options { '); &mapping_settings($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,\%lt, - $stored,$img2); + $stored,$img2,$crstype); return; } @@ -3188,7 +3152,7 @@ sub automapping { if (exists($$stored{'autodrop'})) { $drop = $$stored{'autodrop'}; } - &topic_bar($r,$tabcol,$image,$$lt{'endi'}); + &topic_bar($r,$image,$$lt{'endi'}); $r->print(' @@ -3234,14 +3198,15 @@ 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; 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'}); + &topic_bar($r,$image,$$lt{'pirs'}); $r->print(' @@ -3260,7 +3225,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 +3285,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 +3299,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', @@ -3428,40 +3393,189 @@ sub date_setting_table { 'startdate',$starttime); my $endform = &Apache::lonhtmlcommon::date_setter($formname, 'enddate',$endtime); - my $perpetual = ''; - my $start_table = ''; - $start_table .= "
 
 
 
\n"; - $start_table .= ''. + my $perpetual = + ''; + my $table = "
Default starting date for - member access
\n". + ''. ''. - ''."\n"; - $start_table .= "
'.&mt('Start:').''.$startform.' 
"; - my $end_table = ''; - $end_table .= "\n"; - $end_table .= ''. + ''."\n". + ''. ''. - ''."\n"; - $end_table .= "
Default ending date for - member access 
'.&mt('End:').''.$endform.''.$perpetual.'
\n"; - return ($start_table, $end_table); + '
'.$perpetual.'
\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.'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 = &mt('Error uploading new folder.')." ($newfile): $newmapurl".'
'; + return $outcome; + } + my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap); + if ($fatal) { + $outcome = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".'
'; + 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 = &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 = &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 +3617,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 +3650,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; } } @@ -3549,22 +3664,12 @@ sub validate_groupname { } sub topic_bar { - my ($r,$tabcol,$imgnum,$title) = @_; + my ($r,$imgnum,$title) = @_; $r->print(' -
  - -   - - '.$title.' -