--- loncom/interface/loncoursegroups.pm 2006/07/20 22:17:14 1.55 +++ loncom/interface/loncoursegroups.pm 2008/10/21 14:29:39 1.79 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursegroups.pm,v 1.55 2006/07/20 22:17:14 raeburn Exp $ +# $Id: loncoursegroups.pm,v 1.79 2008/10/21 14:29:39 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,13 +29,14 @@ package Apache::loncoursegroups; use strict; use Apache::lonnet; -use Apache::loncommon; -use Apache::lonhtmlcommon; +use Apache::loncommon(); +use Apache::lonhtmlcommon(); use Apache::lonlocal; -use Apache::lonnavmaps; -use Apache::longroup; -use Apache::portfolio; +use Apache::lonnavmaps(); +use Apache::longroup(); +use Apache::portfolio(); use Apache::Constants qw(:common :http); +use LONCAPA::map(); use lib '/home/httpd/lib/perl/'; use LONCAPA; @@ -91,12 +92,13 @@ sub handler { my $action = $env{'form.action'}; my $state = $env{'form.state'}; - if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify')) { + if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) { if (!defined($state)) { $state = 'view'; } } - if ($action eq 'create' || $action eq 'modify' || $action eq 'view') { + if ($action eq 'create' || $action eq 'modify' || $action eq 'view' || + $action eq 'delete' || $action eq 'reenable') { if ($view_permission || $manage_permission) { if ($state eq 'view') { &print_main_menu($r,$cdom,$cnum,\%functions,\%idx, @@ -109,8 +111,10 @@ sub handler { $crstype); } } else { - $r->print(&mt('You do not have [_1] administration '. - 'privileges in this [_2]',$gpterm,lc($crstype))); + $r->print('
'.$lt{'gnam'}.': | @@ -1299,23 +1677,25 @@ END|||||||||||||||||||||||
'.&mt('Disk quota: ').' | ');
if ($action eq 'create') {
- $r->print(&mt('If you enable the file repository for the [_1], allocate a disk quota.',$gpterm));
+ $r->print(&mt('If you enable the file repository for the '.$gpterm.', allocate a disk quota.'));
} else {
$r->print(&mt('Quota allocated to file repository:'));
}
- $r->print(' Mb');
+ $r->print(' '.&mt('[_1] Mb',''));
if ($action eq 'create') {
- $r->print(' '. - &mt('A total of [_1] Mb can be divided amongst all [_2]s in the '. - '[_3], and [_4] Mb are currently unallocated.',$crsquota, - $gpterm,lc($crstype),sprintf("%.2f",$freespace))); + $r->print(' ' + .&mt('A total of [_1] Mb can be divided amongst all '.$gpterm.'s in the ' + .lc($crstype).', and [_2] Mb are currently unallocated.' + ,$crsquota,sprintf("%.2f",$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].', - sprintf("%.2f",$maxposs),$gpterm,lc($crstype))); + $r->print(' ' + .&mt('The quota can be increased to [_1] Mb, ' + .'by adding all unallocated space for '.$gpterm.'s in the '.lc($crstype).'.' + ,sprintf("%.2f",$maxposs))); } $r->print(' |
@@ -1342,7 +1722,7 @@ sub get_quota_constraints {
}
sub membership_options {
- my ($r,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm) = @_;
+ my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm)=@_;
my $crstype = &Apache::loncommon::course_type();
my %lt = &Apache::lonlocal::texthash(
'pipa' => 'Build a list of users for selection of group members',
@@ -1364,13 +1744,11 @@ sub membership_options {
future => &mt('Will have future access'),
);
- #FIXME need to plumb around for the various cr roles defined by the user
- my @roles = ('st','cc','in','ta','ep');
+ my @roles = ('st','cc','in','ta','ep','cr');
my @sections = keys(%{$sectioncount});
- &topic_bar($r,$image,$lt{'pipa'});
- $r->print('
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'pipa'}).'
'.$lt{'gmem'}.'||||||||||||||||||||||
'); $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types)); $r->print(' | '); - $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles)); + $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles,undef,undef,1,$cdom,$cnum)); if (@sections > 0) { @sections = sort {$a cmp $b} @sections; unshift(@sections,'none'); # Put 'no sections' next @@ -1440,8 +1818,7 @@ sub access_date_settings { } } my ($table) = &date_setting_table($starttime,$endtime,$formname); - &topic_bar($r,$image,$lt{'sten'}); - $r->print(' + $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'sten'}).' '.$table.' '); return; @@ -1518,6 +1895,11 @@ sub display_navbuttons { '); + } elsif ($prevtext) { + $r->print(' + + '); } if ($next) { $r->print(' @@ -1587,7 +1969,7 @@ sub print_current_settings { |
');
if (@{$available} > 0) {
- $r->print(&mt('Available for assignment to members:').
+ $r->print(''.&mt('Available for assignment to members:').''.
' '); } if (@{$unavailable} > 0) { - $r->print(&mt('Unavailable for assignment:'). + $r->print(''.&mt('Unavailable for assignment:').''. ' |
$lt{'difn'} $granularity | -$quota Mb | +$quota_text | $lt{'stda'} $showstart $lt{'enda'} $showend |
@@ -1648,9 +2031,9 @@ sub pick_new_members {
'nnew' => "There are no users to add as new members, as all users".
" matching the specified type(s), role(s), and ".
"section(s) are already affiliated with this group.",
- '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.',
+ '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.",
);
my %members;
my $totalusers = 0;
@@ -1674,7 +2057,7 @@ sub pick_new_members {
$r->print(&check_uncheck_tools($r,$available));
}
}
- &topic_bar($r,$img,$lt{'gpme'});
+ $r->print(&Apache::lonhtmlcommon::topic_bar($img,$lt{'gpme'}));
if (keys(%members) > 0) {
$r->print('
';
}
- $fixed .= ' | |||||||||||||||
'."\n"; } } if ($privcount == 0) { - $dynamic .= ' | None | '."\n"; + $dynamic .= ''.&mt('None').' | '."\n"; } if ($privcount < 3) { $dynamic .= ''."\n"; @@ -2064,11 +2448,11 @@ sub change_members_form { $r->print(' | '. - &mt('all sections').' | '; - } else { - $sections_sel=''. - §ions_selection(\@sections,'sec_'.$role). - ' | '; - } - } - $r->print(&Apache::loncommon::start_data_table_row(). - ''.$plrole. - ' | '.$sections_sel. - &Apache::loncommon::end_data_table_row()); + my $roletitle=&Apache::lonnet::plaintext($role,$crstype); + $r->print(&print_autorole_item($role,$roletitle,\@sections)); } + my @customs; foreach my $role (sort(keys(%customroles))) { - my $sections_sel; - if (@sections > 0) { - $sections_sel = - ''.§ions_selection(\@sections,'sec_'.$role).' | '; - } - $r->print(&Apache::loncommon::start_data_table_row(). - ''.&mt('Custom role: '). - ''.$role.' | '.$sections_sel. - &Apache::loncommon::end_data_table_row()); + my ($roletitle) = ($role =~ m|^cr/[^/]+/[^/]+/(.+)$|); + push (@customs,$role); + $r->print(&print_autorole_item($role,$roletitle,\@sections)); + } + if ($action eq 'modify') { + foreach my $role (@{$$stored{'autorole'}}) { + if ((!grep(/^\Q$role\E$/,@customs)) && + (!grep(/^\Q$role\E$/,@roles))) { + my $roletitle; + if ($role =~ /^cr/) { + ($roletitle) = ($role =~ m|_([^_]+)$|); + } else { + $roletitle = &Apache::lonnet::plaintext($role,$crstype); + } + $r->print(&print_autorole_item($role,$roletitle,\@sections)); + } + } } $r->print(&Apache::loncommon::end_data_table()); return; } +sub print_autorole_item { + my ($role,$roletitle,$sections) = @_; + my $sections_sel; + if (@{$sections} > 0) { + if ($role eq 'cc') { + $sections_sel = ''. + &mt('all sections').' | '; + } else { + $sections_sel=''. + §ions_selection($sections,'sec_'.$role). + ' | '; + } + } + my $output = &Apache::loncommon::start_data_table_row(). + ''. + ' | '.$roletitle.' | '.$sections_sel. + &Apache::loncommon::end_data_table_row(); + return $output; +} + sub standard_roles { my @roles = ('cc','in','ta','ep','st'); return @roles; } -sub my_custom_roles { - my %returnhash=(); - my %rolehash=&Apache::lonnet::dump('roles'); - foreach (keys %rolehash) { - if ($_=~/^rolesdef\_(\w+)$/) { - $returnhash{$1}=$1; - } - } - return %returnhash; -} - sub modify_menu { my ($r,$groupname,$page,$gpterm) = @_; my @menu = @@ -3295,38 +3749,48 @@ sub add_group_folder { if ($cdom eq '' || $cnum eq '') { return &mt('Error: invalid course domain or number - group folder creation failed'); } - my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage); - my $navmap = Apache::lonnavmaps::navmap->new(); + my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage,$warning); my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/'; $allgrpsmap = $crspath.'group_allfolders.sequence'; - my $topmap = $navmap->getResourceByUrl($allgrpsmap); - undef($navmap); if ($action eq 'create') { - # check if group_allfolders.sequence exists. - if (!$topmap) { - my $grpstitle = &mt('[_1] [_2]s',$crstype,$ucgpterm); - my $topmap_url = '/'.$env{'course.'.$env{'request.course.id'}.'.url'}; - $topmap_url =~ s|/+|/|g; - if ($topmap_url =~ m|^/uploaded|) { - $outcome = &map_updater($cdom,$cnum,'group_allfolders.sequence', - 'toplevelgroup',$grpstitle,$topmap_url); + if (&get_folder_lock($cdom,$cnum,'group_allfolders',$now) eq 'ok') { + # check if group_allfolders.sequence exists. + my $mapcontents = &Apache::lonnet::getfile($allgrpsmap); + if ($mapcontents eq '-1') { #file does not exist; + my $grpstitle = &mt('[_1] [_2]s',$crstype,$ucgpterm); + my $topmap_url = '/'.$env{'course.'.$env{'request.course.id'}.'.url'}; + $topmap_url =~ s|/+|/|g; + if ($topmap_url =~ m|^/uploaded|) { + $outcome = &map_updater($cdom,$cnum,'group_allfolders.sequence', + 'toplevelgroup',$grpstitle,$topmap_url); + } else { + $outcome = &mt('Non-standard course - folder for all groups not added.'); + } if ($outcome ne 'ok') { + my $delresult = &release_folder_lock($cdom,$cnum,'group_allfolders'); + if ($delresult ne 'ok') { + $warning = $delresult; + } return $outcome; } - } else { - $outcome = &mt('Non-standard course - folder for all groups not added.'); - return $outcome; } + my $delresult = &release_folder_lock($cdom,$cnum,'group_allfolders'); + if ($delresult ne 'ok') { + $warning = $delresult ; + } + } else { + $outcome = &mt('Could not obtain exclusive lock to check status of the folder for all groups. No group folder added.'); + return $outcome; } - my $grpfolder = &mt('[_1] Folder -',$ucgpterm,).$description; + my $grpfolder = &mt($ucgpterm.' Folder - [_1]',$description); $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/smppg'; - my $grptitle = &mt('Group homepage').' - '.$description; + my $grptitle = &mt('Group homepage - [_1]',$description); my ($discussions,$disctitle); my $outcome = &map_updater($cdom,$cnum,'group_folder_'.$groupname.'.sequence', 'grpseq',$grpfolder,$allgrpsmap,$grppage, $grptitle); if ($outcome ne 'ok') { - return $outcome; + return $outcome.$warning; } my $pageout = &create_homepage($cdom,$cnum,$groupname,$groupinfo, $tools,$gpterm,$ucgpterm,$now); @@ -3337,7 +3801,7 @@ sub add_group_folder { my $outcome = &map_updater($cdom,$cnum,'group_boards_'.$groupname. '.sequence','bbseq',$disctitle,$grpmap); if ($outcome ne 'ok') { - return $outcome; + return $outcome.$warning; } $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence'; } @@ -3345,13 +3809,10 @@ sub add_group_folder { #modify group folder if status of discussions tools is changed } my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum); - $navmap = Apache::lonnavmaps::navmap->new(); + my $navmap = Apache::lonnavmaps::navmap->new(); # modify parameters my $parm_result; if ($action eq 'create') { - if ($allgrpsmap) { - $parm_result .= &parm_setter($navmap,$cdom,$allgrpsmap,$groupname); - } if ($grpmap) { $parm_result .= &parm_setter($navmap,$cdom,$grpmap,$groupname); } @@ -3362,8 +3823,39 @@ sub add_group_folder { $parm_result .= &parm_setter($navmap,$cdom,$boardsmap,$groupname); } } + undef($navmap); if ($parm_result) { - return $parm_result; + return $warning.$parm_result; + } else { + return 'ok'; + } +} + +sub get_folder_lock { + my ($cdom,$cnum,$folder_name,$now) = @_; + # get lock for folder being edited. + my $lockhash = { + $folder_name."\0".'locked_folder' => $now.':'.$env{'user.name'}. + ':'.$env{'user.domain'}, + }; + my $tries = 0; + my $gotlock = &Apache::lonnet::newput('coursegroups',$lockhash,$cdom,$cnum); + + while (($gotlock ne 'ok') && $tries <3) { + $tries ++; + sleep(1); + $gotlock = &Apache::lonnet::newput('coursegroups',$lockhash,$cdom,$cnum); + } + return $gotlock; +} + +sub release_folder_lock { + my ($cdom,$cnum,$folder_name) = @_; + # remove lock + my @del_lock = ($folder_name."\0".'locked_folder'); + my $dellockoutcome=&Apache::lonnet::del('coursegroups',\@del_lock,$cdom,$cnum); + if ($dellockoutcome ne 'ok') { + return ('