[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm loncoursegroups.pm longroup.pm portfolio.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Wed, 28 Jun 2006 23:38:11 -0000


This is a MIME encoded message

--raeburn1151537891
Content-Type: text/plain

raeburn		Wed Jun 28 19:38:11 2006 EDT

  Modified files:              
    /loncom/interface	portfolio.pm loncoursegroups.pm longroup.pm 
                     	loncommon.pm 
  Log:
  File sizes for uploads to course group portfolios may not exceed quota set for group's file repository. When creating a course, a quota can be specified.  The sum of quotas assigned to all groups in a course can not exceed the total quota defined for the course (when the course was created).  - client side and server side enforcement still needed here.  Portfolio permissions modified to allow any user with group creation rights in a course access to all course group portfolio functions.  All uses of words: group, Group, course and Course in "Course Groups Manager" now replaced with context-sensitive terminology provided by loncommon::course_type() and loncommon::group_term() which will supply appropriate text once a decision is made on Group vs Group. Currently "ANGEL-like Discussion Groups" are called Groups, regular courses are called Courses; and within regular courses sectionesque units are called groups, and within Groups they are called teams.
  
  
--raeburn1151537891
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20060628193811.txt"

Index: loncom/interface/portfolio.pm
diff -u loncom/interface/portfolio.pm:1.125 loncom/interface/portfolio.pm:1.126
--- loncom/interface/portfolio.pm:1.125	Wed Jun 28 15:56:59 2006
+++ loncom/interface/portfolio.pm	Wed Jun 28 19:38:09 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # portfolio browser
 #
-# $Id: portfolio.pm,v 1.125 2006/06/28 19:56:59 albertel Exp $
+# $Id: portfolio.pm,v 1.126 2006/06/28 23:38:09 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1433,6 +1433,14 @@
     my $fname=$env{'form.uploaddoc.filename'};
     my $filesize = (length($env{'form.uploaddoc'})) / 1000; #express in k (1024?)
     my $disk_quota = 20000; # expressed in k
+    if (defined($group)) {
+        my $grp_quota = &get_group_quota($group); # quota expressed in k 
+        if ($grp_quota ne '') {
+            $disk_quota = $grp_quota;
+        } else {
+            $disk_quota = 0;
+        }
+    }
     $fname=&Apache::lonnet::clean_filename($fname);
 
     my $portfolio_root=&get_portfolio_root($group);
@@ -1484,6 +1492,7 @@
         }
     }
 }
+
 sub lock_info {
     my ($r,$url,$group) = @_;
     my ($uname,$udom) = &get_name_dom($group);
@@ -1566,6 +1575,23 @@
     return (&Apache::loncommon::propath($udom,$uname).$path);
 }
 
+sub get_group_quota {
+    my ($group) = @_;
+    my $group_quota; 
+    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+    my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group);
+    if (%curr_groups) {
+        my %group_info =  &Apache::longroup::get_group_settings(
+                                                    $curr_groups{$group});
+        $group_quota = $group_info{'quota'}; #expressed in Mb
+        if ($group_quota) {
+            $group_quota = 1000 * $group_quota; #expressed in k
+        } 
+    }
+    return $group_quota;
+} 
+
 sub get_dir_list {
     my ($portfolio_root,$group) = @_;
     my ($uname,$udom) = &get_name_dom($group);
@@ -1694,17 +1720,24 @@
             $earlyout = 1;
         }
         if ($earlyout) { return OK; }
-        if (&Apache::lonnet::allowed('agf',$env{'request.course.id'}.'/'.$group)) {
-            $can_setacl = 1;
-        }
-        if (&Apache::lonnet::allowed('ugf',$env{'request.course.id'}.'/'.$group)) {
-            $can_upload = 1;
-        }
-        if (&Apache::lonnet::allowed('mgf',$env{'request.course.id'}.'/'.$group)) {
+        if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
             $can_modify = 1;
-        }
-        if (&Apache::lonnet::allowed('dgf',$env{'request.course.id'}.'/'.$group)) {
             $can_delete = 1;
+            $can_upload = 1;
+            $can_setacl = 1;
+        } else {
+            if (&Apache::lonnet::allowed('agf',$env{'request.course.id'}.'/'.$group)) {
+                $can_setacl = 1;
+            }
+            if (&Apache::lonnet::allowed('ugf',$env{'request.course.id'}.'/'.$group)) {
+                $can_upload = 1;
+            }
+            if (&Apache::lonnet::allowed('mgf',$env{'request.course.id'}.'/'.$group)) {
+                $can_modify = 1;
+            }
+            if (&Apache::lonnet::allowed('dgf',$env{'request.course.id'}.'/'.$group)) {
+                $can_delete = 1;
+            }
         }
     } else {
         ($uname,$udom) = &get_name_dom();
Index: loncom/interface/loncoursegroups.pm
diff -u loncom/interface/loncoursegroups.pm:1.28 loncom/interface/loncoursegroups.pm:1.29
--- loncom/interface/loncoursegroups.pm:1.28	Wed Jun 28 12:01:01 2006
+++ loncom/interface/loncoursegroups.pm	Wed Jun 28 19:38:09 2006
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: loncoursegroups.pm,v 1.28 2006/06/28 16:01:01 albertel Exp $
+# $Id: loncoursegroups.pm,v 1.29 2006/06/28 23:38:09 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -34,6 +34,7 @@
 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;
@@ -69,13 +70,18 @@
           &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 = ();
@@ -98,43 +104,47 @@
         if ($view_permission || $manage_permission) {
             &group_administration($r,$action,$state,$cdom,$cnum,$function,
                                   $tabcol,\%functions,\%idx,$view_permission,
-                                  $manage_permission,$rowColor1,$rowColor2);
+                                  $manage_permission,$rowColor1,$rowColor2,
+                                  $gpterm,$ucgpterm,$crstype);
         } else {
-            $r->print(&mt('You do not have group administration '.
-                          'privileges in this course'));
+            $r->print(&mt('You do not have [_1] administration '.
+                          'privileges in this [_2]',$gpterm,lc($crstype)));
         }
     } else {
         &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx,
                          $view_permission,$manage_permission,$action,$state,
-                         $rowColor1,$rowColor2);
+                         $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);
     }
     return OK;
 }
 
 sub print_main_menu {
     my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,
-        $manage_permission,$action,$state,$rowColor1,$rowColor2) = @_;
+        $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm,
+        $ucgpterm,$crstype) = @_;
+    my $pagename = "$crstype $ucgpterm".'s';
     my $jscript = qq|
 function changeSort(caller) {
     document.$state.sortby.value = caller;
     document.$state.submit();
 }\n|;
-    $r->print(&header('Course Groups',$jscript,$action,$state,
+    $r->print(&header($pagename,$jscript,$action,$state,
                       undef,$function));
     &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/coursegroups",
-          text=>"Course Groups",});
-    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Groups'));
+          text=>"$pagename"});
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename));
     &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
                     $view_permission,$manage_permission,$action,$state,
-                    $rowColor1,$rowColor2);
+                    $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);
     $r->print(&footer());
     return;
 }
 
 sub display_groups {
     my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,
-        $manage_permission,$action,$state,$rowColor1,$rowColor2) = @_;
+        $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm,
+        $ucgpterm,$crstype) = @_;
     my %curr_groups = ();
     my %grp_info = ();
     my %actionlinks = (
@@ -149,7 +159,7 @@
                           view   => 'View',
                           delete => 'Delete',
                           act    => 'Action',
-                          gname  => 'Group Name',
+                          gname  => "$ucgpterm Name",
                           desc   => 'Description',
                           crea   => 'Creator',
                           crtd   => 'Created',
@@ -159,13 +169,13 @@
                           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)) {
@@ -173,6 +183,9 @@
         }
         my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
         if (%curr_groups) {
+            if ($manage_permission) {
+                $r->print('<br /><a href="/adm/coursegroups?action=create&refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');
+            }
             $r->print('<br /><br />');
             $r->print(&Apache::lonhtmlcommon::start_pick_box());
             $r->print(<<"END");
@@ -203,12 +216,24 @@
                                                          $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') {
@@ -247,6 +272,7 @@
                     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;
@@ -272,7 +298,7 @@
                                       $group.'">'.$lt{'modify'}.'</a>';
                         }
                     }
-                    $r->print('<tr bgcolor="'.$rowColor.'"><td><small>'.$link.'</small></td><td><small>'.$group.'</small></td><td><small>'.$description.'</small></td><td><small>'.$creator.'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($creation).'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($modified).'</small></td><td><small>'.$functionality.'</small></td><td><small>'.$quota.'</small></td><td><small>'.$totalmembers.'</small></td><td><small>'.$totalfiles.'</small></td><td><small>'.$boards.'</small></td><td><small>'.$diskuse.'</small></td></tr>');
+                    $r->print('<tr bgcolor="'.$rowColor.'"><td><small>'.$link.'</small></td><td><small>'.$group.'</small></td><td><small>'.$description.'</small></td><td><small>'.$creator.'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($creation).'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($modified).'</small></td><td><small>'.$functionality.'</small></td><td><small>'.$quota.'</small></td><td><small>'.$totalmembers.'</small></td><td><small><nobr>'.&mt('Files: ').$totalfiles.'</nobr><br /><nobr>'.&mt('Folders: ').$totaldirs.'</nobr></small></td><td><small>'.$boards.'</small></td><td><small>'.$diskuse.'</small></td></tr>');
                     $rowNum ++;
                 }
             }
@@ -292,7 +318,7 @@
             if ($manage_permission) {
                 $r->print('<br /><br /><a href="/adm/coursegroups?action=create&refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');
             } else {
-                $r->print('<br /><br />'.$lt{'crng'});
+                $r->print('<br /><br />'.$lt{'alth'});
 
             }
         }
@@ -313,7 +339,8 @@
             }
         } 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;
@@ -321,7 +348,8 @@
 
 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 = ();
@@ -335,7 +363,8 @@
     my %memchg;
     my @member_changes = ('deletion','expire','activate','reenable',
                           'changefunc','changepriv');
-    my ($groupname,$description,$startdate,$enddate,$granularity,$specificity);
+    my ($groupname,$description,$startdate,$enddate,$granularity,$specificity,
+        $quota);
 
     if (defined($env{'form.groupname'})) {
         $groupname = $env{'form.groupname'};
@@ -359,7 +388,9 @@
         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')))) {
@@ -398,6 +429,7 @@
                 $description = $stored{'description'};
                 $granularity = $stored{'granularity'};
                 $specificity =  $stored{'specificity'};
+                $quota = $stored{'quota'};
             }
         }
     }
@@ -405,7 +437,7 @@
     my %toolprivs =
 	(
 	 email      => {
-	     sgm => 'Send group mail',
+	     sgm => 'Send '.$gpterm.' mail',
 	     sgb => 'Broadcast mail',
 	 },
 	 discussion => {
@@ -462,6 +494,7 @@
 		 enddate_second   => 'text',
 		 groupname        => 'text',
 		 description      => 'text',
+                 quota            => 'text',
 		 tool             => 'checkbox',
 		 granularity      => 'radio',
 		 no_end_date      => 'checkbox',
@@ -776,7 +809,8 @@
     }
 
     my $loaditems =  &onload_action($action,$state);
-    $r->print(&header('Course Groups Manager',
+    my $crumbtitle = "$crstype $ucgpterm".'s'; 
+    $r->print(&header("$crumbtitle Manager",
 		      $jscript,$action,$state,$page,$function,$loaditems));
 
     if ($env{'form.refpage'} eq 'enrl') {
@@ -787,21 +821,21 @@
     } 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',
@@ -815,7 +849,7 @@
     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',
@@ -827,14 +861,15 @@
                 &Apache::lonhtmlcommon::add_breadcrumb(
                    {text=>"$trail{$action}{$state}"});
                 $r->print(&Apache::lonhtmlcommon::breadcrumbs
-			  ('Course Groups Manager'));
+			  ("$crumbtitle Manager"));
                 &display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page,
                        \%sectioncount,$groupname,$description,$functions,
                        \@tools,\%toolprivs,\%fixedprivs,$startdate,$enddate,
                        \%users,\%userdata,$idx,\%memchg,\%usertools,
                        $function,$view_permission,$manage_permission,
-                       \%stored,$granularity,$specificity,\@types,\@roles,
-                       \@sections,\%states,\%navbuttons,$rowColor1,$rowColor2);
+                       \%stored,$granularity,$quota,$specificity,\@types,\@roles,
+                       \@sections,\%states,\%navbuttons,$rowColor1,$rowColor2,
+                       $gpterm,$ucgpterm,$crstype);
                 last;
             } else {
                 if (($state eq 'result') && ($i > 0)) {
@@ -850,12 +885,13 @@
         }
     } elsif (($action eq 'view') && ($view_permission)) {
                         &Apache::lonhtmlcommon::add_breadcrumb(
-                   {text=>"View groups"});
+                   {text=>"View $gpterm".'s'});
+        my $crumbtitle = "$crstype $ucgpterm".'s Manager';
         $r->print(&Apache::lonhtmlcommon::breadcrumbs
-		  ('Course Groups Manager'));
+		  (&mt($crumbtitle)));
         &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
                         $view_permission,$manage_permission,$action,$state,
-                        $rowColor1,$rowColor2);
+                        $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);
 
     }
     $r->print(&footer());
@@ -884,6 +920,7 @@
     $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') {
@@ -923,78 +960,86 @@
     my ($r,$cdom,$cnum,$tabcol,$action,$state,$page,$sectioncount,$groupname,
         $description,$functions,$tools,$toolprivs,$fixedprivs,$startdate,
         $enddate,$users,$userdata,$idx,$memchg,$usertools,$function,
-        $view_permission,$manage_permission,$stored,$granularity,$specificity,
-        $types,$roles,$sections,$states,$navbuttons,$rowColor1,$rowColor2)=@_;
+        $view_permission,$manage_permission,$stored,$granularity,$quota,
+        $specificity,$types,$roles,$sections,$states,$navbuttons,$rowColor1,
+        $rowColor2,$gpterm,$ucgpterm,$crstype) = @_;
     if ($action eq 'create') {
         if ($state eq 'pick_name') {
             &general_settings_form($r,$cdom,$cnum,$action,$tabcol,$state,$page,
                                    $functions,$tools,$toolprivs,$fixedprivs,
                                    $sectioncount,$stored,$states,$navbuttons,
-                                   $rowColor1,$rowColor2);
+                                   $rowColor1,$rowColor2,$gpterm,$ucgpterm,
+                                   $crstype);
         } elsif ($state eq 'pick_members') {
             &choose_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,
-                                 $groupname,$description,$granularity,
+                                 $groupname,$description,$granularity,$quota,
                                  $startdate,$enddate,$tools,$fixedprivs,
                                  $toolprivs,$functions,$users,$userdata,$idx,
                                  $stored,$states,$navbuttons,$rowColor1,
-                                 $rowColor2);
+                                 $rowColor2,$gpterm,$ucgpterm,$crstype);
         } elsif ($state eq 'pick_privs') {
             &choose_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,
                                $startdate,$enddate,$tools,$functions,
                                $toolprivs,$fixedprivs,$userdata,$usertools,
                                $idx,$states,$stored,$sectioncount,$navbuttons,
-                               $rowColor1,$rowColor2);
+                               $rowColor1,$rowColor2,$gpterm,$ucgpterm,
+                               $crstype);
         } elsif ($state eq 'result') {
             &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page,
                              $groupname,$description,$specificity,$userdata,
                              $startdate,$enddate,$tools,$functions,
                              $toolprivs,$usertools,$idx,$types,$roles,
                              $sections,$states,$navbuttons,$memchg,
-                             $sectioncount,$stored,$rowColor1,$rowColor2);
+                             $sectioncount,$stored,$rowColor1,$rowColor2,
+                             $gpterm,$ucgpterm,$crstype);
         }
     } elsif ($action eq 'modify') {
         my $groupname = $env{'form.groupname'};
         if ($state eq 'pick_group') {
             &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
                             $view_permission,$manage_permission,$action,$state,
-                            $rowColor1,$rowColor2);
+                            $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);
         } elsif ($state eq 'pick_task') {
-            &modify_menu($r,$groupname,$page);
+            &modify_menu($r,$groupname,$page,$gpterm);
         } elsif ($state eq 'change_settings') {
             &general_settings_form($r,$cdom,$cnum,$action,$tabcol,$state,$page,
                                    $functions,$tools,$toolprivs,$fixedprivs,
                                    $sectioncount,$stored,$states,$navbuttons,
-                                   $rowColor1,$rowColor2);
+                                   $rowColor1,$rowColor2,$gpterm,$ucgpterm,
+                                   $crstype);
         } elsif ($state eq 'change_members') {
             &change_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,
                                  $groupname,$description,$startdate,$enddate,
                                  $tools,$fixedprivs,$functions,$users,
-                                 $userdata,$granularity,$specificity,$idx,
-                                 $states,$navbuttons,$rowColor1,$rowColor2);
+                                 $userdata,$granularity,$quota,$specificity,
+                                 $idx,$states,$navbuttons,$rowColor1,$rowColor2,
+                                 $gpterm,$ucgpterm);
         } elsif ($state eq 'add_members') {
             &add_members_form($r,$tabcol,$action,$state,$page,$startdate,
                               $enddate,$groupname,$description,$granularity,
-                              $sectioncount,$tools,$functions,$stored,$states,
-                              $navbuttons,$rowColor1,$rowColor2);
+                              $quota,$sectioncount,$tools,$functions,$stored,
+                              $states,$navbuttons,$rowColor1,$rowColor2,$gpterm,
+                              $ucgpterm);
         } elsif ($state eq 'pick_members') {
             &choose_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,
-                                 $groupname,$description,$granularity,
+                                 $groupname,$description,$granularity,$quota,
                                  $startdate,$enddate,$tools,$fixedprivs,
                                  $toolprivs,$functions,$users,$userdata,$idx,
                                  $stored,$states,$navbuttons,$rowColor1,
-                                 $rowColor2);
+                                 $rowColor2,$gpterm,$ucgpterm,$crstype);
         } elsif ($state eq 'pick_privs') {
             &choose_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,
                                $startdate,$enddate,$tools,$functions,
                                $toolprivs,$fixedprivs,$userdata,$usertools,
                                $idx,$states,$stored,$sectioncount,$navbuttons,
-                               $rowColor1,$rowColor2);
+                               $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);
         } elsif ($state eq 'change_privs') {
             &change_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page,
                                $startdate,$enddate,$tools,$functions,
                                $toolprivs,$fixedprivs,$userdata,$usertools,
                                $memchg,$idx,$states,$stored,$sectioncount,
-                               $navbuttons,$rowColor1,$rowColor2);
+                               $navbuttons,$rowColor1,$rowColor2,$gpterm,
+                               $ucgpterm);
         } elsif ($state eq 'chgresult' || $state eq 'memresult' || 
                  $state eq 'addresult') {
             &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page,
@@ -1002,7 +1047,8 @@
                              $startdate,$enddate,$tools,$functions,
                              $toolprivs,$usertools,$idx,$types,$roles,
                              $sections,$states,$navbuttons,$memchg,
-                             $sectioncount,$stored,$rowColor1,$rowColor2);
+                             $sectioncount,$stored,$rowColor1,$rowColor2,
+                             $gpterm,$ucgpterm,$crstype);
         }
     }
 }
@@ -1076,6 +1122,21 @@
 }
 
 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;
 }
 
@@ -1117,23 +1178,26 @@
 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(' <br />
  <table width="100%" cellpadding="0" cellspacing="0" border="0">
 ');
-    &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1);
+    &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1,
+                           $gpterm,$ucgpterm,$crstype);
     $r->print(' 
   <tr>
    <td colspan="4">&nbsp;</td>
   </tr>');
-    &access_date_settings($r,$tabcol,$action,$formname,$stored,2);
+    &access_date_settings($r,$tabcol,$action,$formname,$stored,2,$gpterm,
+                          $ucgpterm);
     $r->print('
   <tr>
    <td colspan="4">&nbsp;</td>
   </tr>');
     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 = ();
@@ -1142,14 +1206,14 @@
         @{$tools} = sort(keys(%{$functions}));
         &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action,
                                3,$tools,$stored,$toolprivs,$fixedprivs,
-                               \@available,$formname);
+                               \@available,$formname,$gpterm,$ucgpterm);
         $r->print('
   <tr>
    <td colspan="4">&nbsp;</td>
   </tr>');
         &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'};
@@ -1161,18 +1225,25 @@
 }
 
 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('
    <tr>
@@ -1233,8 +1304,8 @@
        </td>
       </tr>
       <tr>
-       <td><b>Granularity:</b></td>
-       <td colspan="9">'.$lt{'doyo'}.'&nbsp;<label><input type="radio" name="granularity" value="Yes" />'.&mt('Yes').'</label>&nbsp;<label><input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No').'</label>');
+       <td><b>'.&mt('Granularity:').'</b></td>
+       <td colspan="10">'.$lt{'doyo'}.'&nbsp;<label><input type="radio" name="granularity" value="Yes" />'.&mt('Yes').'</label>&nbsp;<label><input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No').'</label>');
     if ($action eq 'modify') {
         $r->print('&nbsp;&nbsp;('.&mt('Currently set to "[_1]"',
                                       $$stored{'granularity'}).')');
@@ -1242,6 +1313,30 @@
     $r->print('
        </td>
       </tr>
+      <tr>
+       <td valign="top">'.&mt('<b>Disk quota:</b> ').'</td><td colspan="10">');
+    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('&nbsp;<input type="text" name="quota" size="4" />Mb');
+    if ($action eq 'create') {
+        $r->print('<br />'.
+                  &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('&nbsp;&nbsp;('.&mt('The quota is currently [_1] Mb',
+                                      $$stored{'quota'}).').');
+
+        $r->print('<br />'.&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('
+       </td>
+      </tr>
      </table>
     </td>
    </tr>
@@ -1250,20 +1345,21 @@
 }
 
 sub membership_options {
-    my ($r,$action,$state,$tabcol,$sectioncount,$image) = @_;
+    my ($r,$action,$state,$tabcol,$sectioncount,$image,$gpterm,$ucgpterm) = @_;
+    my $crstype = &Apache::loncommon::course_type();
     my %lt = &Apache::lonlocal::texthash(
                 'pipa' => 'Pick parameters to generate membership list',
-                'gmem' => 'Group membership options',
+                'gmem' => "$ucgpterm membership options",
                 'picr' => 'Pick the criteria to use to build a list of '.
-                          'course users from which you will select ',
-                'meof' => 'members of the new group.',
-                'admg' => 'additional members of the group.',
-                'ifno' => 'If you do not wish to add members when you first '.
-                          'create the group, do not make any selections.',
-                'asub' => 'A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified role and section changes.',
+                          lc($crstype).' users from which you will select ',
+                'meof' => "members of the new $gpterm.",
+                'admg' => "additional members of the $gpterm.",
+                'ifno' => "If you do not wish to add members when you first ".
+                          "create the $gpterm, do not make any selections.",
+                'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of $gpterm members triggered by specified role and section changes.",
                 'acty' => 'Access types',
-                'coro' => 'Course roles',
-                'cose' => 'Course sections',
+                'coro' => $crstype.' roles',
+                'cose' => $crstype.' sections',
              );
     my %status_types = (
                    active => &mt('Currently has access'),
@@ -1344,9 +1440,9 @@
 }
 
 sub access_date_settings {
-    my ($r,$tabcol,$action,$formname,$stored,$image) = @_;
+    my ($r,$tabcol,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_;
     my %lt = &Apache::lonlocal::texthash(
-                'sten' => 'Default start and end dates for group access',
+                'sten' => "Default start and end dates for $gpterm access",
              );
     my $starttime = time;
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
@@ -1376,16 +1472,17 @@
 
 sub choose_members_form {
     my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$groupname,$description,
-        $granularity,$startdate,$enddate,$tools,$fixedprivs,$toolprivs,
+        $granularity,$quota,$startdate,$enddate,$tools,$fixedprivs,$toolprivs,
         $functions,$users,$userdata,$idx,$stored,$states,$navbuttons,
-        $rowColor1,$rowColor2) = @_;
+        $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_;
     my @regexps = ('user_','userpriv_','sec_');
     my %origmembers;
     $r->print(&Apache::lonhtmlcommon::echo_form_input(
          ['origin','action','state','page','member','specificity','branch',
           'defpriv','autorole','autoadd','autodrop','sortby','togglefunc'],
          \@regexps));
-    my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum);
+    my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm,
+                                       $ucgpterm,$crstype);
     $r->print('
 <table width="100%" cellpadding="0" cellspacing="0" border="0">
  <tr>
@@ -1406,8 +1503,8 @@
     if ($action eq 'create') {
         &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,
                                 $functions,$startdate,$enddate,$groupname,
-                                $description,$granularity,\@available,
-                                \@unavailable);
+                                $description,$granularity,$quota,\@available,
+                                \@unavailable,$gpterm,$ucgpterm);
         $specimg = 4;
         $memimg = 5;
     } else {
@@ -1429,11 +1526,11 @@
     }
     &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],
@@ -1486,17 +1583,19 @@
 
 sub print_current_settings {
     my ($r,$action,$tabcol,$rowColor1,$rowColor2,$functions,$startdate,$enddate,
-           $groupname,$description,$granularity,$available,$unavailable) =@_;
+        $groupname,$description,$granularity,$quota,$available,$unavailable,
+        $gpterm,$ucgpterm) = @_;
 
     my %lt = &Apache::lonlocal::texthash(
-        grna => 'Group Name',
+        grna => "$ucgpterm Name",
         desc => 'Description',
-        grfn => 'Group Functions',
+        grfn => "$ucgpterm Functions",
         gran => 'Granularity',
+        quot => 'File quota',
         dfac => 'Default access dates',
-        ygrs => 'Your group selections',
-        tfwa => 'The following settings will apply to the group:',
-        difn => 'Different functionality<br />for different users:',
+        ygrs => "Your $gpterm selections",
+        tfwa => "The following settings will apply to the $gpterm:",
+        difn => 'Different functionality<br />for different members:',
         stda => 'Start date',
         enda => 'End date:',
     );
@@ -1527,6 +1626,7 @@
   <td><b>'.$lt{'desc'}.'</b></td>
   <td><b>'.$lt{'grfn'}.'</b></td>
   <td><b>'.$lt{'gran'}.'</b></td>
+  <td><b>'.$lt{'quot'}.'</b></td>
   <td><b>'.$lt{'dfac'}.'</b></td>
  </tr>
  <tr bgcolor="'.$rowColor2.'">
@@ -1573,7 +1673,8 @@
     $r->print(<<"END");
   </td>
   <td valign="top"><small><b>$lt{'difn'}
-  </b> $granularity</small> 
+  </b> $granularity</small></td>
+  <td valign="top"><small>$quota Mb</small></td> 
   <td valign="top"><small><b>$lt{'stda'}</b> $showstart<br />
       <b>$lt{'enda'}</b> $showend</small>
   </td>
@@ -1589,16 +1690,17 @@
 
 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.',
@@ -1755,7 +1857,7 @@
 
 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, '.
@@ -1770,19 +1872,19 @@
                 '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 <b>optional</b> privileges members '.
                 'will receive by default.',
       'oppr' => 'Optional privileges',
@@ -2047,11 +2149,11 @@
 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(
@@ -2076,7 +2178,8 @@
 ');
     &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,
                             $functions,$startdate,$enddate,$groupname,
-                          $description,$granularity,\@available,\@unavailable);
+                            $description,$granularity,$quota,\@available,
+                            \@unavailable,$gpterm,$ucgpterm);
 $r->print('
 </td></tr><tr><td colspan="4">&nbsp;</td></tr>');
     &topic_bar($r,$tabcol,2,$lt{'mogm'});
@@ -2418,13 +2521,13 @@
     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));
@@ -2463,12 +2566,13 @@
                   '</td></tr><tr><td colspan="4">&nbsp;</td></tr>');
     }
     
-    &topic_bar($r,$tabcol,4,&mt('Group member privileges'));
+    &topic_bar($r,$tabcol,4,&mt('[_1] member privileges',$ucgpterm));
 
     my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools,
                                           $toolprivs,$fixedprivs,$userdata,
                                           $usertools,$idx,$memchg,$states,
-                                          $stored,$rowColor1,$rowColor2);
+                                          $stored,$rowColor1,$rowColor2,
+                                          $gpterm);
     $r->print('</td></tr><tr><td colspan="4">&nbsp;</td></tr>');
     my $prevtext = $$navbuttons{'gtps'};
     if ($numchgs || $exp_or_del) {
@@ -2483,8 +2587,8 @@
 
 sub add_members_form {
     my ($r,$tabcol,$action,$formname,$page,$startdate,$enddate,$groupname,
-        $description,$granularity,$sectioncount,$tools,$functions,$stored,
-        $states,$navbuttons,$rowColor1,$rowColor2) = @_; 
+        $description,$granularity,$quota,$sectioncount,$tools,$functions,
+        $stored,$states,$navbuttons,$rowColor1,$rowColor2,$gpterm,$ucgpterm)=@_; 
     $r->print(' <br />
 <table width="100%" cellpadding="0" cellspacing="0" border="0">
  <tr>
@@ -2496,7 +2600,8 @@
     &check_tools($functions,$tools,\@available,\@unavailable);
     &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,
                             $functions,$startdate,$enddate,$groupname,
-                            $description,$granularity,\@available,\@unavailable);
+                            $description,$granularity,$quota,\@available,
+                            \@unavailable,$gpterm,$ucgpterm);
     $r->print('
    </td>
   </tr>
@@ -2504,7 +2609,8 @@
    <td colspan="4">&nbsp;</td>
   </tr>');
 
-    &membership_options($r,$action,$formname,$tabcol,$sectioncount,1);
+    &membership_options($r,$action,$formname,$tabcol,$sectioncount,1,$gpterm,
+                        $ucgpterm);
     my $nexttext = $$navbuttons{'gtns'};
     my $prevtext = $$navbuttons{'gtpp'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
@@ -2517,7 +2623,8 @@
 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;
@@ -2535,11 +2642,11 @@
     }
 
     $r->print('<br /><table width="100%" cellpadding="0" cellspacing="0" border="0">');
-    &topic_bar($r,$tabcol,6,&mt('Group member privileges'));
+    &topic_bar($r,$tabcol,6,&mt('[_1] member privileges',$ucgpterm));
 
     &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs,
                             $fixedprivs,$userdata,$usertools,$idx,undef,
-                            $states,$stored,$rowColor1,$rowColor2);
+                            $states,$stored,$rowColor1,$rowColor2,$gpterm);
 
     $r->print('</td></tr><tr><td colspan="4">&nbsp;</td></tr>');
     if ($action eq 'create') {
@@ -2548,7 +2655,7 @@
             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'};
@@ -2618,7 +2725,8 @@
 
 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',
@@ -2627,15 +2735,15 @@
             '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',
@@ -2794,12 +2902,14 @@
     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('
 <table width="100%" cellpadding="0" cellspacing="0" border="0">
@@ -2845,13 +2955,15 @@
                                      $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;
 }
@@ -2859,7 +2971,7 @@
 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'};
@@ -2870,7 +2982,7 @@
     my $esc_description = &escape($description);
     my @single_attributes = ('description','functions','startdate','enddate',
                              'creation','modified','creator','granularity',
-                             'specificity','autoadd','autodrop');
+                             'specificity','autoadd','autodrop','quota');
     my @mult_attributes = ('roles','types','sectionpick','defpriv');
 
     my %groupinfo = (
@@ -2884,6 +2996,7 @@
                      specificity => $specificity,
                      autoadd => $env{'form.autoadd'},
                      autodrop => $env{'form.autodrop'},
+                     quota => $env{'form.quota'},                
                    );
     foreach my $func (keys(%{$functions})) {
         my $status;
@@ -2932,27 +3045,30 @@
     if ($result eq 'ok') {
         if ($action eq 'create') {
             my $put_result = &create_homepage($cdom,$cnum,$groupname,
-                                              \%groupinfo,$tools);
-            $r->print('Group '.$groupname.' was created.<br />');
+                                              \%groupinfo,$tools,$gpterm,
+                                              $ucgpterm);
+            $r->print(&mt('[_1] [_2] was created.<br />',$ucgpterm,$groupname));
         } else {
-            $r->print('Group '.$groupname.' was updated.<br />');
+            $r->print(&mt('[_1] [_2] was updated.<br />',$ucgpterm,$groupname));
         }
     } else {
         my %actiontype = (
                           'create' => 'creating',
                           'modify' => 'modifying',
                          );
-        &Apache::lonnet::logthis('Failed to store group '.$groupname.
-                                 'in course: '.$cnum.' in domain: '.$cdom);
-        $r->print(&mt('An error occurred when [_1] the new group. '.
-                      'Please try again.',$actiontype{$action}));
+        &Apache::lonnet::logthis("Failed to store $gpterm $groupname ".
+                                 'in '.lc($crstype).': '.$cnum.
+                                 ' in domain: '.$cdom);
+        $r->print(&mt('An error occurred when [_1] the new [_2]. '.
+                      'Please try again.',$actiontype{$action},$gpterm));
     }
     return $result;
 }
 
 sub process_membership {
     my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,
-        $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg)=@_;
+        $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,
+        $gpterm,$ucgpterm)=@_;
     my %usersettings = ();
     my %added= ();
     my %failed = ();
@@ -3149,30 +3265,31 @@
         $r->print('<br />');
     }
     if ($roster_result eq 'ok') {
-        $r->print('<br />'.&mt('Group membership list updated.'));
+        $r->print('<br />'.&mt('[_1] membership list updated.',$ucgpterm));
     } else {
-        $r->print('<br />'.&mt('An error occurred while updating the group membership list -').$roster_result.'<br />');
+        $r->print('<br />'.&mt('An error occurred while updating the [_1] membership list -',$gpterm).$roster_result.'<br />');
     }
     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('
@@ -3180,7 +3297,7 @@
     <td colspan="4">&nbsp;</td>
    </tr>');
     &mapping_settings($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,\%lt,
-                                                       $stored,$img2);
+                      $stored,$img2,$crstype);
     return;
 }
 
@@ -3240,7 +3357,8 @@
 }
 
 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;
@@ -3266,7 +3384,7 @@
     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') {
@@ -3326,10 +3444,10 @@
 }
 
 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',
@@ -3340,7 +3458,7 @@
             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',
@@ -3454,7 +3572,7 @@
 }
 
 sub create_homepage {
-    my ($cdom,$cnum,$name,$groupinfo,$tools) = @_;
+    my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm) = @_;
     my $functionality = join(',',@{$tools});
     my $content = &unescape($$groupinfo{description});
     $content=~s/\s+$//s;
@@ -3463,7 +3581,7 @@
     $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' => '',
@@ -3509,22 +3627,22 @@
 }
 
 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 = '<b>'.$lt{'igna'}.'</b><br /><br />'.$lt{'tgne'}.' "'.
@@ -3542,12 +3660,13 @@
     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'}.'<br />'.$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;
         }
     }
Index: loncom/interface/longroup.pm
diff -u loncom/interface/longroup.pm:1.5 loncom/interface/longroup.pm:1.6
--- loncom/interface/longroup.pm:1.5	Mon Jun 26 18:20:57 2006
+++ loncom/interface/longroup.pm	Wed Jun 28 19:38:10 2006
@@ -92,11 +92,11 @@
 hash of hashes for (b)
 
 Keys (in two categories):
-(a) groupname, creator, creation, modified, startdate,enddate.
+(a) groupname, creator, creation, modified, startdate, enddate, quota.
 Corresponding values are name of the group, creator of the group
 (username:domain), UNIX time for date group was created, and
-settings were last modified, and default start and end access
-times for group members.
+settings were last modified, file quota, and default start and end 
+access times for group members.
 
 (b) functions returned in hash of hashes.
 Outer hash key is functions.
@@ -415,5 +415,42 @@
 
 ###############################################
 
+sub sum_quotas {
+    my ($courseid) = @_;
+    my $totalquotas = 0;
+    my ($cdom,$cnum);
+    if (!defined($courseid)) {
+        if (defined($env{'request.course.id'})) {
+            $courseid = $env{'request.course.id'};
+            $cdom = $env{'course.'.$courseid.'.domain'};
+            $cnum = $env{'course.'.$courseid.'.num'};
+        } else {
+            return '';
+        }
+    } else {
+        ($cdom,$cnum) = split(/_/,$courseid);
+    }
+    if ($cdom && $cnum) {
+        my %curr_groups = &coursegroups($cdom,$cnum);
+        if (%curr_groups) {
+            foreach my $group (keys(%curr_groups)) {
+                my %settings=&get_group_settings($curr_groups{$group});
+                my $quota = $settings{'quota'};
+                if ($quota eq '') {
+                    $quota = 0;
+                }
+                $totalquotas += $quota; 
+            }
+        } else {
+            return 0;
+        }
+    } else {
+        return '';
+    }
+    return $totalquotas;
+}
+
+###############################################
+
 1;
 
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.405 loncom/interface/loncommon.pm:1.406
--- loncom/interface/loncommon.pm:1.405	Wed Jun 28 16:15:37 2006
+++ loncom/interface/loncommon.pm	Wed Jun 28 19:38:10 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.405 2006/06/28 20:15:37 albertel Exp $
+# $Id: loncommon.pm,v 1.406 2006/06/28 23:38:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -5179,6 +5179,15 @@
     }
 }
 
+sub group_term {
+    my $crstype = &course_type();
+    my %names = (
+                  'Course' => 'group',
+                  'Group' => 'team',
+                );
+    return $names{$crstype};
+}
+
 sub icon {
     my ($file)=@_;
     my $curfext = (split(/\./,$file))[-1];

--raeburn1151537891--