--- loncom/interface/loncoursegroups.pm 2006/11/28 19:46:00 1.65
+++ loncom/interface/loncoursegroups.pm 2008/05/07 00:10:59 1.76
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: loncoursegroups.pm,v 1.65 2006/11/28 19:46:00 raeburn Exp $
+# $Id: loncoursegroups.pm,v 1.76 2008/05/07 00:10:59 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('
');
@@ -237,13 +254,13 @@ END
my $members_result = &group_members($cdom,$cnum,$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);
+ &group_files($group,$port_path,\$totalfiles,\$totaldirs);
$grp_info{$group}{'totalfiles'} = $totalfiles;
$grp_info{$group}{'totaldirs'} = $totaldirs;
- my $diskuse = &Apache::lonnet::diskusage($cdom,$cnum,$port_dir);
+ my $getpropath = 1;
+ my $diskuse = &Apache::lonnet::diskusage($cdom,$cnum,$port_path, $getpropath);
if ($grp_info{$group}{'quota'} > 0) {
my $pct_use = 0.1 * $diskuse/$grp_info{$group}{'quota'};
$grp_info{$group}{'diskuse'} = sprintf("%.0f",$pct_use);
@@ -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,
@@ -1160,7 +1178,8 @@ sub delete_group {
$usersettings{$groupname.':'.$user} = $now.':-1:'.$userprivs;
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,
$groupname,$user,
- $now,'-1',$userprivs)
+ $now,'-1',$userprivs,
+ '',$context)
eq 'ok') {
$num_ok ++;
push(@deleted,$user);
@@ -1216,7 +1235,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 +1285,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 +1307,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,
@@ -1297,10 +1316,14 @@ sub verify_reenable {
}
sub reenable_group {
- my ($r,$cdom,$cnum,$groupname,) = @_;
+ my ($r,$cdom,$cnum,$groupname) = @_;
my %groups =
&Apache::longroup::coursegroups($cdom,$cnum,$groupname,
'deleted_groups');
+ if (keys(%groups) == 0) {
+ $r->print(&mt('The group ([_1]) was not re-enabled, because it is not a deleted group.
Perhaps it has already been re-enabled?',$groupname));
+ return;
+ }
my %groupinfo =
&Apache::longroup::get_group_settings($groups{$groupname});
my $defstart = $groupinfo{'startdate'};
@@ -1335,7 +1358,8 @@ sub reenable_group {
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,
$groupname,$user,
$defend,$defstart,
- $userprivs) eq 'ok') {
+ $userprivs,'',
+$context) eq 'ok') {
$num_ok ++;
push(@enabled,$user);
} else {
@@ -1368,6 +1392,7 @@ sub reenable_group {
} else {
$r->print(&mt('Re-enabling group failed'));
}
+ return;
}
sub header {
@@ -1437,16 +1462,16 @@ sub build_members_list {
}
sub group_files {
- my ($group,$currdir,$numfiles,$numdirs) = @_;
+ my ($group,$portpath,$numfiles,$numdirs) = @_;
my $dirptr=16384;
- my @dir_list=&Apache::portfolio::get_dir_list($currdir,$group);
+ my @dir_list=&Apache::portfolio::get_dir_list($portpath,undef,$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;
+ $portpath .= '/'.$filename;
$$numdirs ++;
- &group_files($numfiles,$numdirs)
+ &group_files($group,$portpath,$numfiles,$numdirs)
} else {
$$numfiles ++;
}
@@ -3134,7 +3159,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') {
@@ -3277,7 +3302,7 @@ sub process_membership {
$curr_privs{$user};
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
$user,$now,$savestart,
- $curr_privs{$user}) eq 'ok') {
+ $curr_privs{$user},''',$context) eq 'ok') {
push(@{$added{'expired'}},$user);
$num_ok ++;
} else {
@@ -3288,7 +3313,7 @@ sub process_membership {
foreach my $user (@deletion) {
$usersettings{$groupname.':'.$user} = $now.':-1:';
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
- $user,$now,'-1','')
+ $user,$now,'-1','','',$context)
eq 'ok') {
push(@{$added{'deleted'}},$user);
$num_ok ++;
@@ -3342,7 +3367,7 @@ sub process_membership {
$group_privs{$user};
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
$user,$end,$start,
- $group_privs{$user}) eq 'ok') {
+ $group_privs{$user},'',$context) eq 'ok') {
push(@{$added{$type}},$user);
$num_ok ++;
} else {
@@ -3668,38 +3693,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);
@@ -3710,7 +3745,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';
}
@@ -3718,7 +3753,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') {
@@ -3732,8 +3767,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';
}
@@ -3750,7 +3816,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".'
';
@@ -3761,8 +3827,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;
}
}
@@ -3796,18 +3862,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;
}