--- loncom/interface/loncoursegroups.pm 2006/02/21 18:56:00 1.6 +++ loncom/interface/loncoursegroups.pm 2006/06/29 17:01:26 1.30 @@ -1,3 +1,6 @@ +# The LearningOnline Network with CAPA +# +# $Id: loncoursegroups.pm,v 1.30 2006/06/29 17:01:26 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,14 +33,18 @@ use Apache::loncommon; 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) = @_; &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - + if ($r->header_only) { return OK; } @@ -63,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 = (); @@ -82,59 +94,72 @@ sub handler { my $rowColor2 = "#eeeeee"; my $action = $env{'form.action'}; + my $state = $env{'form.state'}; + if ((!defined($action)) || ($action eq 'view')) { + if (!defined($state)) { + $state = 'view'; + } + } if ($action eq 'create' || $action eq 'modify' || $action eq 'view') { if ($view_permission || $manage_permission) { - &group_administration($r,$action,$cdom,$cnum,$function,$tabcol, - \%functions,\%idx,$view_permission, - $manage_permission,$rowColor1,$rowColor2); + &group_administration($r,$action,$state,$cdom,$cnum,$function, + $tabcol,\%functions,\%idx,$view_permission, + $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, - $rowColor1,$rowColor2); + $view_permission,$manage_permission,$action,$state, + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); } return OK; } sub print_main_menu { my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$rowColor1,$rowColor2) = @_; - $r->print(&header('Course Groups',&mt('LON-CAPA Course Groups'), - undef,undef,undef,undef,$function)); + $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($pagename,$jscript,$action,$state, + undef,$function)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursegroups", - text=>"Course Groups",}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Course Groups')); + text=>"$pagename"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename)); &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action,$rowColor1, - $rowColor2); + $view_permission,$manage_permission,$action,$state, + $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,$rowColor1,$rowColor2) = @_; + $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm, + $ucgpterm,$crstype) = @_; my %curr_groups = (); my %grp_info = (); - my %actionlinks = ( - modify => ' 'View', delete => 'Delete', act => 'Action', - gname => 'Group Name', + gname => "$ucgpterm Name", desc => 'Description', crea => 'Creator', crtd => 'Created', @@ -144,15 +169,24 @@ sub display_groups { memb => 'Members', file => 'Files', dibd => 'Discussion Boards', - dius => 'Disk Use', - ); - $r->print('

'); + dius => 'Disk Use (%)', + nogr => 'No '.$gpterm.'s exist.', + crng => 'Create a new '.$gpterm, + alth => 'Although your current role has privileges'. + ' 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)) { $action = 'view'; } - my %curr_groups; - if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) { + 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"); @@ -169,7 +203,7 @@ sub display_groups { - + @@ -178,16 +212,28 @@ END my %Sortby = (); foreach my $group (sort(keys(%curr_groups))) { %{$grp_info{$group}} = - &Apache::loncommon::get_group_settings( + &Apache::longroup::get_group_settings( $curr_groups{$group}); my $members_result = &group_members($cdom,$cnum,$group, \%grp_info); - 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'; + } 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') { @@ -219,13 +265,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; @@ -241,43 +288,68 @@ END if ($action eq 'modify' || $action eq 'delete') { $link .= $group; } else { - $link .= $group.'/grppg?register=1'; + $link .= $group.'/grppg'; + } + $link .= '">'.$lt{$action}.''; + if ($action eq 'view') { + if (($manage_permission) && + ($env{'form.refpage'} ne 'enrl')) { + $link .= '  '.$actionlinks{'modify'}. + $group.'">'.$lt{'modify'}.''; + } } - $link .= '">'.$lt{$action}.''; - $r->print(''); + $r->print(''); $rowNum ++; } } $r->print('
$lt{'func'} $lt{'quot'}$lt{'memb'}$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(''); + if ($action eq 'view') { + if (!defined($state)) { + $state = 'view'; + } + $r->print(''); + } } else { - $r->print('No groups exist'); + $r->print($lt{'nogr'}); + if ($manage_permission) { + $r->print('

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

'.$lt{'alth'}); + + } } } else { my @coursegroups = split(/:/,$env{'request.course.groups'}); if (@coursegroups > 0) { - my %curr_groups; - if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) { + $r->print('

'); + my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum); + if (%curr_groups) { foreach my $group (@coursegroups) { - my %group_info = &Apache::loncommon::get_group_settings( + my %group_info = &Apache::longroup::get_group_settings( $curr_groups{$group}); - my $description = &Apache::lonnet::unescape( + my $description = &unescape( $group_info{description}); my ($uname,$udom) = split(/:/,$group_info{creator}); - $r->print(''.$group,'
'.$description.'

'); + $r->print(''.$group,'
'.$description.'

'); } } } 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; } sub group_administration { - my ($r,$action,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$rowColor1,$rowColor2) = @_; + my ($r,$action,$state,$cdom,$cnum,$function,$tabcol,$functions,$idx, + $view_permission,$manage_permission,$rowColor1,$rowColor2,$gpterm, + $ucgpterm,$crstype) = @_; my %sectioncount = (); my @tools = (); my @types = (); @@ -291,8 +363,8 @@ sub group_administration { my %memchg; my @member_changes = ('deletion','expire','activate','reenable', 'changefunc','changepriv'); - my $state = $env{'form.state'}; - my ($groupname,$description,$startdate,$enddate,$granularity,$specificity); + my ($groupname,$description,$startdate,$enddate,$granularity,$specificity, + $quota); if (defined($env{'form.groupname'})) { $groupname = $env{'form.groupname'}; @@ -316,7 +388,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')))) { @@ -330,7 +404,11 @@ sub group_administration { if ($action eq 'modify') { if ($state eq '') { - $state = 'pick_group'; + if (defined($env{'form.groupname'})) { + $state = 'pick_task'; + } else { + $state = 'pick_group'; + } } else { %stored = &retrieve_settings($cdom,$cnum,$groupname); if (ref($stored{'types'}) eq 'ARRAY') { @@ -351,89 +429,106 @@ sub group_administration { $description = $stored{'description'}; $granularity = $stored{'granularity'}; $specificity = $stored{'specificity'}; + $quota = $stored{'quota'}; } } } - my %toolprivs = (); - %{$toolprivs{'email'}} = ( - sgm => 'Send group mail', - sgb => 'Broadcast mail', - ); - %{$toolprivs{'discussion'}} = ( - cgb => 'Create boards', - pgd => 'Post', - pag => 'Anon. posts', - rgi => 'Get identities', - vgb => 'View boards', - ); - %{$toolprivs{'chat'}} = ( - pgc => 'Chat', - ); - %{$toolprivs{'files'}} = ( - rgf => 'Retrieve', - ugf => 'Upload', - dgf => 'Delete', - ); - %{$toolprivs{'roster'}} = ( - vgm => 'View', - ); - %{$toolprivs{'homepage'}} = ( - vgh => 'View page', - mgh => 'Modify page', - ); - my %fixedprivs = (); - %{$fixedprivs{'email'}} = ('sgm' => 1); - %{$fixedprivs{'discussion'}} = ('vgb' => 1); - %{$fixedprivs{'chat'}} = ('pgc' => 1); - %{$fixedprivs{'files'}} = ('rgf' => 1); - %{$fixedprivs{'roster'}} = ('vgm' => 1); - %{$fixedprivs{'homepage'}} = ('vgh' => 1); - - my %elements = (); - %{$elements{'create'}} = (); - %{$elements{'modify'}} = (); - %{$elements{'create'}{'pick_name'}} = ( - startdate_month => 'selectbox', - startdate_hour => 'selectbox', - enddate_month => 'selectbox', - enddate_hour => 'selectbox', - startdate_day => 'text', - startdate_year => 'text', - startdate_minute => 'text', - startdate_second => 'text', - enddate_day => 'text', - enddate_year => 'text', - enddate_minute => 'text', - enddate_second => 'text', - groupname => 'text', - description => 'text', - tool => 'checkbox', - granularity => 'radio', - no_end_date => 'checkbox', - ); - %{$elements{'modify'}{'change_settings'}} = ( - %{$elements{'create'}{'pick_name'}}, - specificity => 'radio', - defpriv => 'checkbox', - autorole => 'checkbox', - autoadd => 'radio', - autodrop => 'radio', - ); + my %toolprivs = + ( + email => { + sgm => 'Send '.$gpterm.' 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', + mgf => 'Modify', + dgf => 'Delete', + agf => 'Control Access', + }, + roster => { + vgm => 'View', + }, + homepage => { + vgh => 'View page', + mgh => 'Modify page', + }, + ); + + my %fixedprivs = + ( + email => {sgm => 1}, + discussion => {vgb => 1}, + chat => {pgc => 1}, + files => {rgf => 1}, + roster => {vgm => 1}, + homepage => {vgh => 1}, + ); + + my %elements = + ( + create => { + pick_name => { + startdate_month => 'selectbox', + startdate_hour => 'selectbox', + enddate_month => 'selectbox', + enddate_hour => 'selectbox', + startdate_day => 'text', + startdate_year => 'text', + startdate_minute => 'text', + startdate_second => 'text', + enddate_day => 'text', + enddate_year => 'text', + enddate_minute => 'text', + enddate_second => 'text', + groupname => 'text', + description => 'text', + quota => 'text', + tool => 'checkbox', + granularity => 'radio', + no_end_date => 'checkbox', + }, + pick_members => { + member => 'checkbox', + defpriv => 'checkbox', + }, + }, + ); + + $elements{'modify'} = { + change_settings => { + %{$elements{'create'}{'pick_name'}}, + specificity => 'radio', + defpriv => 'checkbox', + autorole => 'checkbox', + autoadd => 'radio', + autodrop => 'radio', + }, + add_members => { + types => 'selectbox', + roles => 'selectbox', + }, + }; + if (ref($stored{'autorole'}) eq 'ARRAY') { foreach my $role (@{$stored{'autorole'}}) { - $elements{'modify'}{'change_settings'}{'sec_'.$role} = 'selectbox'; + unless ($role eq 'cc') { + $elements{'modify'}{'change_settings'}{'sec_'.$role} = + 'selectbox'; + } } } - %{$elements{'create'}{'pick_members'}} = ( - member => 'checkbox', - defpriv => 'checkbox', - ); - - %{$elements{'modify'}{'add_members'}} = ( - types => 'selectbox', - roles => 'selectbox', - ); if (($action eq 'create') && ($state eq 'pick_name')) { $elements{'create'}{'pick_name'}{'types'} = 'selectbox'; @@ -443,16 +538,16 @@ sub group_administration { (($state eq 'pick_name') || ($state eq 'pick_privs'))) || (($action eq 'modify') && (($state eq 'change_settings') || ($state eq 'add_members')))) { - my $numsections = &Apache::loncommon::get_sections($cdom,$cnum, - \%sectioncount); - if ($numsections > 0) { + %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum); + if (%sectioncount) { $elements{'create'}{'pick_name'}{'sectionpick'} = 'selectbox'; $elements{'modify'}{'change_mapping'}{'sectionpick'} = 'selectbox'; $elements{'modify'}{'add_members'}{'sectionpick'} = 'selectbox'; } } - if ($action eq 'create') { + if (($action eq 'create') || + ($action eq 'modify' && $state eq 'pick_members')) { if (defined($env{'form.types'})) { @types=&Apache::loncommon::get_env_multiple('form.types'); } @@ -461,7 +556,7 @@ sub group_administration { } if (defined($env{'form.sectionpick'})) { @sections=&Apache::loncommon::get_env_multiple('form.sectionpick'); - if (grep/^_all$/,@sections) { + if (grep/^all$/,@sections) { @sections = sort {$a cmp $b} keys(%sectioncount); } } @@ -473,6 +568,9 @@ sub group_administration { } if ($state eq 'pick_members') { if ((keys(%users) > 0) && (@tools > 0)) { + if ($granularity eq 'Yes') { + $elements{$action}{'pick_members'}{'togglefunc'} = 'checkbox'; + } foreach my $tool (@tools) { if ($granularity eq 'Yes') { $elements{$action}{'pick_members'}{'user_'.$tool} = 'checkbox'; @@ -527,6 +625,9 @@ sub group_administration { $elements{$action}{'change_members'}{'reenable'} = 'checkbox'; } if ($numusers) { + if ($granularity eq 'Yes') { + $elements{$action}{'change_members'}{'togglefunc'} = 'checkbox'; + } foreach my $tool (@tools) { if ($granularity eq 'Yes') { $elements{$action}{'change_members'}{'user_'.$tool} = 'checkbox'; @@ -539,11 +640,17 @@ sub group_administration { } if (($state eq 'pick_privs') || ($state eq 'change_privs') || - (($specificity eq 'No') && - (($state eq 'result') || ($state eq 'memresult')))) { + (($specificity eq 'No') && + ($state eq 'memresult' || $state eq 'result' || $state eq 'addresult'))) { foreach my $tool (@tools) { my @values = &Apache::loncommon::get_env_multiple('form.user_'.$tool); foreach my $user (@values) { + if ($state eq 'pick_privs' || $state eq 'result' + || $state eq 'addresult') { + if (!grep(/^\Q$user\E$/,@members)) { + next; + } + } unless(exists($usertools{$user}{$tool})) { $usertools{$user}{$tool} = 1; } @@ -670,7 +777,7 @@ function changeSort(caller) { document.$state.sortby.value = caller; document.$state.submit(); } - + |; $jscript .= &Apache::lonhtmlcommon::set_form_elements( \%{$elements{$action}{$state}},\%stored); @@ -684,7 +791,7 @@ function changeSort(caller) { @{$branchstates{'members'}} = ('change_members','change_privs','memresult'); @{$branchstates{'adds'}} = ('add_members','pick_members','pick_privs', 'addresult'); - + if (defined($env{'form.branch'})) { push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}}); } @@ -702,8 +809,9 @@ function changeSort(caller) { } my $loaditems = &onload_action($action,$state); - $r->print(&header('Course Groups Manager',&mt('LON-CAPA Groups Manager'), - $jscript,$action,$state,$page,$function,$loaditems)); + my $crumbtitle = "$crstype $ucgpterm".'s'; + $r->print(&header("$crumbtitle Manager", + $jscript,$action,$state,$page,$function,$loaditems)); if ($env{'form.refpage'} eq 'enrl') { &Apache::lonhtmlcommon::add_breadcrumb @@ -713,21 +821,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', @@ -741,7 +849,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', @@ -753,17 +861,18 @@ function changeSort(caller) { &Apache::lonhtmlcommon::add_breadcrumb( {text=>"$trail{$action}{$state}"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'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 =~ /^\w+result$/) && ($i > 0)) { + if (($state eq 'result') && ($i > 0)) { &Apache::lonhtmlcommon::add_breadcrumb( {href=>"javascript:backPage(document.$state,'$states{$action}[0]')", text=>"$trail{$action}{$states{$action}[$i]}"}); @@ -776,12 +885,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 - (undef,'Course Groups Manager')); + (&mt($crumbtitle))); &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action, - $rowColor1,$rowColor2); + $view_permission,$manage_permission,$action,$state, + $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); } $r->print(&footer()); @@ -790,55 +900,58 @@ function changeSort(caller) { sub retrieve_settings { my ($cdom,$cnum,$groupname) = @_; - my %groupinfo; + my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname); + + return if (!%curr_groups); + + my %groupinfo = + &Apache::longroup::get_group_settings($curr_groups{$groupname}); + my %stored; - my %curr_groups; - my $numgroups = &Apache::loncommon::coursegroups(\%curr_groups,$cdom, - $cnum,$groupname); - if ($numgroups > 0) { - %groupinfo = &Apache::loncommon::get_group_settings( - $curr_groups{$groupname}); - $stored{'description'} = &Apache::lonnet::unescape( - $groupinfo{'description'}); - $stored{'startdate'} = $groupinfo{'startdate'}; - $stored{'enddate'} = $groupinfo{'enddate'}; - if ($stored{'enddate'} == 0) { - $stored{'no_end_date'} = 1; - } - $stored{'granularity'} = $groupinfo{'granularity'}; - $stored{'specificity'} = $groupinfo{'specificity'}; - $stored{'creation'} = $groupinfo{'creation'}; - $stored{'creator'} = $groupinfo{'creator'}; - - foreach my $tool (sort(keys(%{$groupinfo{'functions'}}))) { - if ($groupinfo{functions}{$tool} eq 'on') { - push(@{$stored{tool}},$tool); - } - } - foreach my $role (@{$groupinfo{'roles'}}) { - push(@{$stored{roles}},$role); - } - foreach my $type (@{$groupinfo{'types'}}) { - push(@{$stored{types}},$type); - } - foreach my $section (@{$groupinfo{'sectionpick'}}) { - push(@{$stored{sectionpick}},$section); - } - foreach my $defpriv (@{$groupinfo{'defpriv'}}) { - push(@{$stored{defpriv}},$defpriv); - } - $stored{'autoadd'} = $groupinfo{'autoadd'}; - $stored{'autodrop'} = $groupinfo{'autodrop'}; - if (exists($groupinfo{'autosec'})) { - foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) { - foreach my $section (@{$groupinfo{'autosec'}{$role}}) { - push (@{$stored{'sec_'.$role}},$section); - } - if (@{$groupinfo{'autosec'}{$role}} > 0) { - push(@{$stored{'autorole'}},$role); - } + + $stored{'description'} = + &unescape($groupinfo{'description'}); + $stored{'startdate'} = $groupinfo{'startdate'}; + $stored{'enddate'} = $groupinfo{'enddate'}; + if ($stored{'enddate'} == 0) { + $stored{'no_end_date'} = 1; + } + $stored{'granularity'} = $groupinfo{'granularity'}; + $stored{'specificity'} = $groupinfo{'specificity'}; + $stored{'creation'} = $groupinfo{'creation'}; + $stored{'creator'} = $groupinfo{'creator'}; + $stored{'quota'} = $groupinfo{'quota'}; + + foreach my $tool (sort(keys(%{$groupinfo{'functions'}}))) { + if ($groupinfo{functions}{$tool} eq 'on') { + push(@{$stored{tool}},$tool); + } + } + foreach my $role (@{$groupinfo{'roles'}}) { + push(@{$stored{roles}},$role); + } + foreach my $type (@{$groupinfo{'types'}}) { + push(@{$stored{types}},$type); + } + foreach my $section (@{$groupinfo{'sectionpick'}}) { + push(@{$stored{sectionpick}},$section); + } + foreach my $defpriv (@{$groupinfo{'defpriv'}}) { + push(@{$stored{defpriv}},$defpriv); + } + $stored{'autoadd'} = $groupinfo{'autoadd'}; + $stored{'autodrop'} = $groupinfo{'autodrop'}; + if (exists($groupinfo{'autosec'})) { + foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) { + if (ref($groupinfo{'autosec'}{$role}) eq 'ARRAY') { + foreach my $section (@{$groupinfo{'autosec'}{$role}}) { + push (@{$stored{'sec_'.$role}},$section); + } + if (@{$groupinfo{'autosec'}{$role}} > 0) { + push(@{$stored{'autorole'}},$role); + } } - } + } } return %stored; } @@ -847,78 +960,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, - $rowColor1,$rowColor2); + $view_permission,$manage_permission,$action,$state, + $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, @@ -926,25 +1047,23 @@ 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,$title,$jscript,$action,$state,$page,$function,$loaditems) = @_; - my $html=&Apache::lonxml::xmlbegin(); - my $bodytag=&Apache::loncommon::bodytag($bodytitle,$function,$loaditems); + my ($bodytitle,$jscript,$action,$state,$page,$function,$loaditems) = @_; + my $start_page= + &Apache::loncommon::start_page($bodytitle, + '', + {'function' => $function, + 'add_entries' => $loaditems,}); my $output = <<"END"; -$html - -$title - - -$bodytag -
+$start_page + END if ($action eq 'create' || $action eq 'modify') { @@ -960,30 +1079,31 @@ END sub onload_action { my ($action,$state) = @_; - my $loaditems; + my %loaditems; if ((defined($env{'form.origin'})) && ($action eq 'create') && ($state eq 'pick_name' || $state eq 'pick_members' || $state eq 'pick_privs')) { unless ($env{'form.origin'} eq '') { - $loaditems = - 'onload="javascript:setFormElements(document.'.$state.')"'; + $loaditems{'onload'} = + 'javascript:setFormElements(document.'.$state.')'; } } if (($action eq 'modify') && ($state eq 'change_settings' || $state eq 'change_members' || - $state eq 'change_privs') || $state eq 'add_members') { - $loaditems = - 'onload="javascript:setFormElements(document.'.$state.')"'; + $state eq 'change_privs' || $state eq 'add_members' || + $state eq 'pick_members')) { + $loaditems{'onload'} = + 'javascript:setFormElements(document.'.$state.')'; } - return $loaditems; + return \%loaditems; } sub footer { + my $end_page = &Apache::loncommon::end_page(); return(< - - +$end_page ENDFOOT } @@ -1002,6 +1122,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; } @@ -1014,7 +1149,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; @@ -1044,23 +1178,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 = (); @@ -1069,14 +1206,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'}; @@ -1088,18 +1225,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(' @@ -1136,18 +1280,18 @@ END } my @allfunctions = sort(keys (%{$functions})); for (my $i=0; $i<$halfnum; $i++) { - $r->print(' + $$functions{$allfunctions[$i]}.''); } $r->print(''); for (my $j=$halfnum; $j<@allfunctions; $j++) { - $r->print(' + $$functions{$allfunctions[$j]}.''); } if ($remnum) { @@ -1160,8 +1304,8 @@ END - - + + + +
 
 
 
 '. - $$functions{$allfunctions[$i]}.'   '. '
  '. - $$functions{$allfunctions[$j]}.'   
Granularity:'.$lt{'doyo'}.' '.&mt('Yes').' '.&mt('No')); + '.&mt('Granularity:').''.$lt{'doyo'}.'  '); if ($action eq 'modify') { $r->print('  ('.&mt('Currently set to "[_1]"', $$stored{'granularity'}).')'); @@ -1169,6 +1313,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(' +
@@ -1177,26 +1345,28 @@ 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', + 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'), previous => &mt('Previously had access'), future => &mt('Will have future access'), ); - + my @roles = ('st','cc','in','ta','ep','cr'); my @sections = keys(%{$sectioncount}); @@ -1208,7 +1378,7 @@ sub membership_options { '.$lt{'gmem'}.'
'.$lt{'picr'}); if ($action eq 'create') { - $r->print($lt{'meof'}.'
'.$lt{'ifno'}); + $r->print($lt{'meof'}.'
'.$lt{'ifno'}.'
'.$lt{'asub'}); } else { $r->print($lt{'admg'}); } @@ -1232,8 +1402,8 @@ sub membership_options { $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles)); if (@sections > 0) { @sections = sort {$a cmp $b} @sections; - unshift(@sections,'_all'); # Put 'all' at the front of the list - unshift(@sections,'_nosec'); # Put 'no sections' next + unshift(@sections,'all'); # Put 'all' at the front of the list + unshift(@sections,'none'); # Put 'no sections' next $r->print('  '. §ions_selection(\@sections,'sectionpick').''); @@ -1254,9 +1424,9 @@ sub sections_selection { $numvisible = @{$sections}; } foreach my $sec (@{$sections}) { - if ($sec eq '_all') { + if ($sec eq 'all') { $section_sel .= '