--- loncom/interface/loncoursegroups.pm 2006/11/28 21:38:04 1.66 +++ loncom/interface/loncoursegroups.pm 2008/04/16 22:40:02 1.73 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursegroups.pm,v 1.66 2006/11/28 21:38:04 raeburn Exp $ +# $Id: loncoursegroups.pm,v 1.73 2008/04/16 22:40:02 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -140,15 +140,19 @@ function openGroupRoster(group,status) { rosterbrowser.focus(); }\n|; $r->print(&header('Groups',$jscript,$action,$state)); - if ($env{'form.refpage'} eq 'enrl') { + if ($env{'form.refpage'} eq 'cusr') { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"/adm/dropadd", - text=>"Enrollment Manager"}); + ({href=>"/adm/createuser", + text=>"User Management"}); } &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursegroups", text=>"Groups"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Groups')); + my $helpitem; + if ($manage_permission) { + $helpitem = 'Creating_Groups'; + } + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Groups',$helpitem)); &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, $manage_permission,$action,$state,$gpterm,$ucgpterm, $crstype); @@ -189,6 +193,7 @@ sub display_groups { dius => 'Disk Use (%)', nogr => 'No groups exist.', crng => 'Create a new group', + redg => 'Re-enable a deleted group', alth => 'Although your current role has privileges'. ' to view any existing groups in this '. lc($crstype).', you do not have privileges '. @@ -198,16 +203,28 @@ sub display_groups { if (!defined($action)) { $action = 'view'; } - my $status; + my ($status,$reenable_link); if ($action eq 'reenable') { $status = 'deleted_groups'; + } else { + if ($manage_permission) { + my %deleted_groups = + &Apache::longroup::coursegroups($cdom,$cnum,undef,'deleted_groups'); + if (keys(%deleted_groups) > 0) { + $reenable_link = '    '.$lt{'redg'}.''; + } + } } my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef, $status); + if (%curr_groups) { if ($manage_permission) { - if (!exists($env{'form.refpage'})) { - $r->print('
'.$lt{'crng'}.''); + if ($action ne 'reenable') { + $r->print('
'.$lt{'crng'}.''); + } + if ($reenable_link) { + $r->print($reenable_link); } } $r->print('

'); @@ -312,8 +329,7 @@ END } $link .= '">'.$lt{$action}.''; if ($action eq 'view') { - if (($manage_permission) && - ($env{'form.refpage'} ne 'enrl')) { + if ($manage_permission) { $link .= '  '.$actionlinks{'modify'}. $group.'">'.$lt{'modify'}.''. '  '.$actionlinks{'delete'}. @@ -349,12 +365,14 @@ END } else { $r->print($lt{'nogr'}); if ($manage_permission) { - if (!exists($env{'form.refpage'})) { - $r->print('

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

'.$lt{'crng'}.''); + if ($action ne 'reenable') { + if ($reenable_link) { + $r->print($reenable_link); + } } } else { $r->print('

'.$lt{'alth'}); - } } } else { @@ -848,14 +866,14 @@ function changeSort(caller) { $r->print(&header("Groups Manager", $jscript,$action,$state,$page,$loaditems)); - if ($env{'form.refpage'} eq 'enrl') { + if ($env{'form.refpage'} eq 'cusr') { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"/adm/dropadd", - text=>"Enrollment Manager", + ({href=>"/adm/createuser", + text=>"User Management", faq=>9,bug=>'Instructor Interface',}); if ($action eq 'modify' || $action eq 'delete') { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"/adm/coursegroups?refpage=enrl&action=$action", + ({href=>"/adm/coursegroups?refpage=cusr&action=$action", text=>"Groups", faq=>9,bug=>'Instructor Interface',}); } @@ -1132,7 +1150,7 @@ sub verify_delete { my $prevtext = &mt('Go back'); my $nexttext = &mt('Delete group'); my $prev; - if ($env{'form.refpage'} eq 'enrl') { + if ($env{'form.refpage'} eq 'cusr') { $prev = 'view'; } &display_navbuttons($r,$formname,$prev,$prevtext, @@ -1216,7 +1234,7 @@ sub reenable_folder { $LONCAPA::map::order[1+$#LONCAPA::map::order]=$idx; my ($outtext,$errtext) = &LONCAPA::map::storemap($allgrpsmap,1); if ($errtext) { - $outcome = &mt('Error storing updated parent folder to group'). + $outcome = &mt('Error saving updated parent folder to group'). "- $allgrpsmap - $errtext".'
'; } else { my ($furl,$ferr) = @@ -1266,7 +1284,7 @@ sub modify_folders { $#LONCAPA::map::order--; my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1); if ($errtext) { - $outcome = &mt('Error storing updated parent folder to group'). "- $map - $errtext".'
'; + $outcome = &mt('Error saving updated parent folder to group'). "- $map - $errtext".'
'; } else { my ($furl,$ferr) = &Apache::lonuserstate::readmap($cdom.'/'.$cnum); @@ -1288,7 +1306,7 @@ sub verify_reenable { my $prevtext = &mt('Go back'); my $nexttext = &mt('Reenable group'); my $prev; - if ($env{'form.refpage'} eq 'enrl') { + if ($env{'form.refpage'} eq 'cusr') { $prev = 'view'; } &display_navbuttons($r,$formname,$prev,$prevtext, @@ -1451,7 +1469,7 @@ sub group_files { if ($dirptr&$testdir) { $currdir .= '/'.$filename; $$numdirs ++; - &group_files($numfiles,$numdirs) + &group_files($group,$currdir,$numfiles,$numdirs); } else { $$numfiles ++; } @@ -3139,7 +3157,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)); } elsif ($action eq 'modify') { @@ -3673,28 +3691,38 @@ 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; $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/smppg'; @@ -3704,7 +3732,7 @@ sub add_group_folder { '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); @@ -3715,7 +3743,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'; } @@ -3723,7 +3751,7 @@ 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') { @@ -3737,8 +3765,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 ('
'.&mt('Warning: failed to release lock for folder: [_1].',$folder_name).'
'); } else { return 'ok'; } @@ -3755,7 +3814,7 @@ sub map_updater { if ($newmapurl !~ m|^/uploaded|) { $outcome = &mt('Error uploading new folder.')." ($newfile): $newmapurl".'
'; return $outcome; - } + } my ($errtext,$fatal)=&LONCAPA::map::mapread($parentmap); if ($fatal) { $outcome = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".'
'; @@ -3766,8 +3825,8 @@ sub map_updater { ':false:normal:res'; $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx; my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1); - if ($outtext) { - $outcome = &mt('Error storing updated parent folder')." ($parentmap): $errtext".'
'; + if ($errtext) { + $outcome = &mt('Error saving updated parent folder')." ($parentmap): $errtext".'
'; return $outcome; } } @@ -3801,18 +3860,23 @@ sub parm_setter { }, ); my $res = $navmap->getResourceByUrl($url); - my $symb = $res->symb(); - foreach my $level (keys(%hide_settings)) { - my $parmresult = &Apache::lonparmset::storeparm_by_symb($symb, + if ($res) { + my $symb = $res->symb(); + foreach my $level (keys(%hide_settings)) { + my $parmresult = + &Apache::lonparmset::storeparm_by_symb($symb, '0_hiddenresource', $hide_settings{$level}{'num'}, $hide_settings{$level}{'set'}, 'string_yesno',undef,$cdom, undef,undef, $hide_settings{$level}{'extra'}); - if ($parmresult) { - $allresults .= $level.': '.$parmresult; + if ($parmresult) { + $allresults .= $level.': '.$parmresult; + } } + } else { + $allresults = &mt('Parameters not set for [_1] because the resource was not recognized as part of the course',$url).'
'; } return $allresults; }