--- loncom/interface/loncoursegroups.pm 2006/07/02 17:08:42 1.36 +++ loncom/interface/loncoursegroups.pm 2006/07/07 15:54:15 1.39 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursegroups.pm,v 1.36 2006/07/02 17:08:42 raeburn Exp $ +# $Id: loncoursegroups.pm,v 1.39 2006/07/07 15:54:15 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -112,40 +112,37 @@ sub handler { '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,$gpterm,$ucgpterm,$crstype); + &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm, + $crstype); } return OK; } sub print_main_menu { - my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm, - $ucgpterm,$crstype) = @_; + my ($r,$cdom,$cnum,$functions,$idx,$view_permission,$manage_permission, + $action,$state,$gpterm,$ucgpterm,$crstype) = @_; my $pagename = "$crstype $ucgpterm".'s'; my $jscript = qq| function changeSort(caller) { document.$state.sortby.value = caller; document.$state.submit(); }\n|; - $r->print(&header($pagename,$jscript,$action,$state, - undef,$function)); + $r->print(&header($pagename,$jscript,$action,$state)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursegroups", 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,$gpterm,$ucgpterm,$crstype); + &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm, + $crstype); $r->print(&footer()); return; } sub display_groups { - my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm, - $ucgpterm,$crstype) = @_; + my ($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm,$crstype) = @_; my %curr_groups = (); my %grp_info = (); my %actionlinks = ( @@ -188,28 +185,24 @@ sub display_groups { $r->print('
'.$lt{'crng'}.''); } $r->print('

'); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); + $r->print(<<"END"); - - - - - - - - - - - - - - - + + + + + + + + + + + END + $r->print(&Apache::loncommon::end_data_table_header_row()); my %Sortby = (); foreach my $group (sort(keys(%curr_groups))) { %{$grp_info{$group}} = @@ -259,17 +252,10 @@ END push(@{$Sortby{$group}},$group); } } - my $rowNum = 0; - my $rowColor; foreach my $key (sort(keys(%Sortby))) { foreach my $group (@{$Sortby{$key}}) { - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; - } my $description = - &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'}; @@ -302,12 +288,23 @@ END $group.'">'.$lt{'modify'}.''; } } - $r->print(''); - $rowNum ++; + $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense'). + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + &Apache::loncommon::end_data_table_row()); } } - $r->print('
$lt{'act'}$lt{'gname'}$lt{'desc'}$lt{'crea'} - $lt{'crtd'} - $lt{'last'} - $lt{'func'} - $lt{'quot'}$lt{'memb'}$lt{'file'}$lt{'dibd'}$lt{'dius'}
$lt{'act'}$lt{'gname'}$lt{'desc'}$lt{'crea'}$lt{'crtd'}$lt{'last'}$lt{'func'} + $lt{'quot'}$lt{'memb'}$lt{'file'}$lt{'dibd'}$lt{'dius'}
'.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.&mt('Files: ').$totalfiles.'
'.&mt('Folders: ').$totaldirs.'
'.$boards.''.$diskuse.'
'.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.&mt('Files: ').$totalfiles.'
'.&mt('Folders: ').$totaldirs.'
'.$boards.''.$diskuse.'
'); - $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(&Apache::loncommon::end_data_table()); $r->print(''); if ($action eq 'view') { @@ -368,7 +365,7 @@ sub group_administration { my @member_changes = ('deletion','expire','activate','reenable', 'changefunc','changepriv'); my ($groupname,$description,$startdate,$enddate,$granularity,$specificity, - $quota); + $quota,$validate_script); if (defined($env{'form.groupname'})) { $groupname = $env{'form.groupname'}; @@ -727,11 +724,51 @@ sub group_administration { } } } - + + if (($action eq 'create' && $state eq 'pick_name') || + ($action eq 'modify' && $state eq 'change_settings')) { + my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,\%stored); + my $space_trim = '/^\s*|\s*\$/g,""'; + my $float_check = '/^([0-9]*\.?[0-9]*)$/'; + $validate_script = ' + var newquota = document.'.$state.'.quota.value; + newquota.replace('.$space_trim.'); + if (newquota == "" ) { + document.'.$state.'.quota.value = 0; + newquota = 0; + } + var maxposs = '.$maxposs.'; + if (newquota > maxposs) { + alert("The file repository quota you entered for this group ("+newquota+" Mb) exceeds the maximum possible ("+maxposs+" Mb). Please enter a smaller number."); + return; + } + var re_quota = '.$float_check.'; + var check_quota = newquota.match(re_quota); + if (check_quota == null) { + alert("The quota you entered contains invalid characters, the quota should only include numbers, with or without a decimal point."); + return; + } + if (newquota == 0) { + var warn_zero = 0; + for (var i=0; iprint(&header("$crumbtitle Manager", - $jscript,$action,$state,$page,$function,$loaditems)); + $jscript,$action,$state,$page,$loaditems)); if ($env{'form.refpage'} eq 'enrl') { &Apache::lonhtmlcommon::add_breadcrumb @@ -855,9 +892,9 @@ function changeSort(caller) { my $crumbtitle = "$crstype $ucgpterm".'s Manager'; $r->print(&Apache::lonhtmlcommon::breadcrumbs (&mt($crumbtitle))); - &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); + &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm, + $crstype); } $r->print(&footer()); @@ -962,9 +999,9 @@ sub display_control { } 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,$gpterm,$ucgpterm,$crstype); + &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm, + $ucgpterm,$crstype); } elsif ($state eq 'pick_task') { &modify_menu($r,$groupname,$page,$gpterm); } elsif ($state eq 'change_settings') { @@ -1020,13 +1057,12 @@ sub display_control { } sub header { - my ($bodytitle,$jscript,$action,$state,$page,$function,$loaditems) = @_; + my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_; my $start_page= &Apache::loncommon::start_page($bodytitle, '', - {'function' => $function, - 'add_entries' => $loaditems,}); + {'add_entries' => $loaditems,}); my $output = <<"END"; $start_page
@@ -1204,12 +1240,7 @@ sub groupsettings_options { '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; + my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored); &topic_bar($r,$tabcol,$image,$lt{'gnde'}); $r->print(' @@ -1310,6 +1341,22 @@ END return; } +sub get_quota_constraints { + my ($action,$stored) = @_; + my ($crsquota,$freespace,$maxposs); + $crsquota = $env{'course.'.$env{'request.course.id'}.'.internal.coursequota'}; + if ($crsquota eq '') { + $crsquota = 20; + } + $freespace = $crsquota - &Apache::longroup::sum_quotas(); + if ($action eq 'create') { + $maxposs = $freespace; + } else { + $maxposs = $$stored{'quota'} + $freespace; + } + return ($crsquota,$freespace,$maxposs); +} + sub membership_options { my ($r,$action,$state,$tabcol,$sectioncount,$image,$gpterm,$ucgpterm) = @_; my $crstype = &Apache::loncommon::course_type(); @@ -2875,6 +2922,22 @@ sub write_group_data { 'specificity','autoadd','autodrop','quota'); my @mult_attributes = ('roles','types','sectionpick','defpriv'); + my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action, + $stored); + my $quota = $env{'form.quota'}; + + $quota =~ s/^\s*([^\s]*)\s*$/$1/; + if ($quota eq '') { + $quota = 0; + } + if ($quota !~ /^\d*\.?\d*$/) { + $quota = 0; + $r->print(&mt('The value you entered for the quota for the file repository in this [_1] contained invalid characters, so it has been set to 0 Mb. You can change this by modifying the [_1] settings.
',$gpterm)); + } + if ($quota > $maxposs) { + $quota = $maxposs; + $r->print(&mt('The value you entered for the quota for the file repository in this [_1] exceeded the maximum possible value, so it has been set to [_2] Mb (the maximum possible value).
',$gpterm,$maxposs)); + } my %groupinfo = ( description => $esc_description, startdate => $startdate, @@ -2886,8 +2949,9 @@ sub write_group_data { specificity => $specificity, autoadd => $env{'form.autoadd'}, autodrop => $env{'form.autodrop'}, - quota => $env{'form.quota'}, + quota => $quota, ); + foreach my $func (keys(%{$functions})) { my $status; if (grep(/^$func$/,@{$tools})) { @@ -2938,7 +3002,7 @@ sub write_group_data { $description,$tools,\%groupinfo, $gpterm,$ucgpterm,$crstype); if ($result ne 'ok') { - $r->print(&mt('A problem occurred when creating folders for the new [_1]. [_2].',$gpterm,$result)); + $r->print(&mt('A problem occurred when creating folders for the new [_1]. [_2].
',$gpterm,$result)); } $r->print(&mt('[_1] [_2] was created.
',$ucgpterm,$groupname)); } else { @@ -2952,7 +3016,7 @@ sub write_group_data { &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]. '. + $r->print(&mt('An error occurred when [_1] the [_2]. '. 'Please try again.',$actiontype{$action},$gpterm)); } return $result; @@ -3072,17 +3136,6 @@ sub process_membership { my $start = $startdate; my $end = $enddate; if ($state eq 'memresult') { - if ($curr_privs{$user} eq $group_privs{$user}) { - push(@unchanged,$user); - next; - } - if (exists($curr_start{$user})) { - $start = $curr_start{$user}; - } - if (exists($curr_end{$user})) { - $end = $curr_end{$user}; - } - $type = 'modified'; if (@activate > 0) { if (grep/^$user$/,@activate) { $start = $now; @@ -3097,6 +3150,19 @@ sub process_membership { $type = 'reenabled'; } } + if ($type eq '') { + if ($curr_privs{$user} eq $group_privs{$user}) { + push(@unchanged,$user); + next; + } + if (exists($curr_start{$user})) { + $start = $curr_start{$user}; + } + if (exists($curr_end{$user})) { + $end = $curr_end{$user}; + } + $type = 'modified'; + } } else { $type = 'added'; } @@ -3555,12 +3621,12 @@ sub map_updater { my $newmapurl=&Apache::lonnet::finishuserfileupload($cnum,$cdom,$itemname, $newfile); if ($newmapurl !~ m|^/uploaded|) { - $outcome = "Error uploading new folder ($newfile): $newmapurl"; + $outcome = &mt('Error uploading new folder.')." ($newfile): $newmapurl".'
'; return $outcome; } my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap); if ($fatal) { - $outcome = "Error reading contents of parent folder ($parentmap): $errtext\n"; + $outcome = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".'
'; return $outcome; } else { my $newidx=&Apache::lonratedt::getresidx($newmapurl); @@ -3569,7 +3635,7 @@ sub map_updater { $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx; my ($outtext,$errtext) = &Apache::lonratedt::storemap($parentmap,1); if ($errtext) { - $outcome = "Error storing updated parent folder ($parentmap): $errtext\n"; + $outcome = &mt('Error storing updated parent folder')." ($parentmap): $errtext".'
'; return $outcome; } } @@ -3590,7 +3656,7 @@ sub new_map { sub parm_setter { my ($navmap,$cdom,$url,$groupname) = @_; - my %parmresult; + my $allresults; my %hide_settings = ( 'course' => { 'num' => 13, @@ -3605,15 +3671,18 @@ sub parm_setter { my $res = $navmap->getResourceByUrl($url); my $symb = $res->symb(); foreach my $level (keys(%hide_settings)) { - $parmresult{$level} = &Apache::lonparmset::storeparm_by_symb($symb, + my $parmresult = &Apache::lonparmset::storeparm_by_symb($symb, '0_hiddenresource', $hide_settings{$level}{'num'}, $hide_settings{$level}{'set'}, 'string_yesno',undef,$cdom, undef,undef, $hide_settings{$level}{'extra'}); + if ($parmresult) { + $allresults .= $level.': '.$parmresult; + } } - return %parmresult; + return $allresults; } sub create_homepage {